C++ return语句后删除指针

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

我遇到了以下问题:我想返回一个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即可

然后将值存储在那里,并返回值,无新内容


附加提示: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打电话时出现的内存泄漏,我同意你的说法。