删除return语句后的指针

Delete pointer after return statement

本文关键字:指针 语句 return 删除      更新时间:2023-10-16

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

提前谢谢。如果问题描述不好,请告诉我。

只需将数据成员类型从jint*更改为普通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++的历史版本,那么写NULL0而不是nullptr。不过nullptr更好——它可以防止代码中的错误)。

您还应该在取消引用y之前检查它,并修复多次调用setY时出现的内存泄漏。由于该类管理一个单独的资源,您还需要仔细遵循"三条规则",以避免进一步的内存错误。

希望本练习的重点是向您展示指针杂耍有多困难,以及使用更惯用的技术有多容易——在本例中,只需直接存储int

类似的东西

int getY()
{
   int value = -1;
   if (y_ptr) {
      value = *y_ptr;
      y_ptr = nullptr;
   }
   return value;
}

然而,我必须补充一点,这只是指针的滥用,不要这样做。