C++ return语句后删除指针
我遇到了以下问题:我想返回一个Y坐标,返回后需要删除它 有没有办法做到这一点,因为我觉得我遗漏了一些重要的东西C++ return语句后删除指针,c++,pointers,C++,Pointers,我遇到了以下问题:我想返回一个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 coord
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即可 然后将值存储在那里,并返回值,无新内容
附加提示: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;
}
但是,我必须补充一点,这只是对指针的滥用,不要这样做。为什么在blazes中y是指向单个整数的指针?将值存储在临时内存中。还有,你到底想完成什么?C++具有价值语义,将其用于你的快速响应。对于学校项目,我们需要使用指针。所以我在学习指针之类的东西。虽然我已经掌握了诀窍,但这是我不懂的。@user3208216您不懂,因为这不是该语言功能的使用方式。如果某件事很难做或看起来很尴尬,那通常不是该怎么做。@pmr好吧,这确实是有道理的。其实我以为这就是目的。非常感谢您的帮助*y=NULL不是,但是OP希望将nullptr分配给y而不是*y@Bathsheba那么,你有什么建议?我现在使用了一个临时文件,那么这是正确的方法吗?或者我不应该在这个特殊的情况下首先使用这些指针吗?在这里使用指针是很特殊的。我会将int存储为类成员,而不是int*。感谢您的快速响应。所以你建议不要使用指针?我将值从*int传递到常规int,因此可以删除并将指针设为NULL。但是我认为指针的整个概念在这个程序中就消失了。我仍然在学习C++,这是一个学校的练习,所以我们将非常感谢你的进一步的解释:谢谢你的回应和帮助。我想我现在明白了,谢谢你:谢谢你的回复。这确实是我需要做的,因为我需要使用指针。你的答案对我帮助最大,因为它解释得很好,符合我的练习。非常感谢。措辞比我的答案好,只是想附加一句,在取消引用指针之前,您应该添加一个null ptr检查,如果您取消引用null ptr,您将不会玩得很开心。@CasperVonB:事实上,您应该在取消引用之前检查y,正如答案所说的那样。@MikeSeymour可以发誓说,在设置y之前,你也应该检查y,以修复你在给setY打电话时出现的内存泄漏,我同意你的说法。