[英]Delete pointer after return statement
我遇到了以下問題:我想返回一個Y坐標,返回后需要刪除它。
有沒有辦法做到這一點,因為我想我在這里錯過了一些重要的事情。
void setY(int y)
{
this->y = new(int); //pointing to new address
*this->y = y; //change value of pointer
}
int getY()
{
return *y; //give the coordinate
delete y; //what I want
*y = NULL; //what I want
}
先感謝您。 如果問題沒有很好地描述,請告訴我。
只需將您的數據成員類型從 j int*
更改為普通int
。
然后將值存儲在那里,並返回值,沒有new
東西。
附加提示: get
前綴在 Java 或 C# 等具有內省的語言中很有用,但在 C++ 中不是必需的(只是口頭表達)。
盡管存在設計缺陷,但最簡單的方法是復制:
int getY()
{
int ret = *y;
delete y; //what I want
/*No assignment to deferenced y is possible - you've deleted it*/
y = nullptr; /*a further delete on y will be benign*/
return ret;
}
既然你說你真的需要把指針作為學習練習的一部分,你需要在刪除之前閱讀返回值:
int result = *y;
delete y;
y = nullptr; // NOT *y - that's been deleted
return result;
(如果你堅持使用 C++ 的歷史版本,那么寫NULL
或0
而不是nullptr
。但nullptr
更好 - 它可以防止代碼中的錯誤)。
您還應該在取消引用之前檢查y
,並修復多次調用setY
時出現的內存泄漏。 由於該類管理一個單獨的資源,您還需要仔細遵循三原則以避免進一步的內存錯誤。
希望這個練習的重點是向您展示指針雜耍有多么困難,以及使用更多慣用技術有多容易 - 在這種情況下,只需直接存儲一個int
。
像這樣的東西
int getY()
{
int value = -1;
if (y_ptr) {
value = *y_ptr;
y_ptr = nullptr;
}
return value;
}
但是我必須補充一點,這只是濫用指針,不要這樣做。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.