【问题标题】:deallocate an object directly in C++ [duplicate]直接在C ++中释放对象[重复]
【发布时间】:2017-03-18 18:17:58
【问题描述】:

我是 C++ 新手,我试图用不同的方式释放对象。这是我的代码:

class foo{
public:
    int* bar;

    foo(int N){
        bar = new int[N];
    }

    ~foo(void){
        delete[] bar;
    }
};

int main(int argc, char* argv[]){
    foo* F = new foo(10);
    delete F;
    return 0;
}

这很好用,但是如果我这样写 main:

int main(int argc, char* argv[]){
    foo F = foo(10);
    F.~foo();
    return 0;
}

我最终会得到“检测到 glibc”。我想我应该以某种方式释放“bar”指针,因为它是在构造过程中分配的。

因此我的问题是如何释放这样的对象?谢谢。

【问题讨论】:

  • 这就是美丽。具有自动存储持续时间的对象的析构函数在超出范围时被调用。
  • chris 表示你不必调用 F.~foo(),它会被自动调用。
  • 顺便说一句,第二行应该是“foo F(10);”。
  • 将语句:bar = NULL;(或nullptr)附加到析构函数,并考虑当F超出范围时会发生什么......'
  • 感谢大家非常有帮助的回复,现在很清楚了。

标签: c++ object memory-management delete-operator


【解决方案1】:

对于 C++ 开发新手来说,你涉水太深了。

线

foo F = foo(10);

做了很多事情。它在堆栈上分配一个临时的新 foo 对象。由于没有new,它不在堆中,临时对象的生命周期就是那一行。它将所述对象复制到变量 F。然后它会破坏临时 foo。

您的类没有定义复制构造函数,因此 C++ 按值复制它。在该行的末尾,您将得到一个包含指向已删除数组的指针的对象。

其余的很明显。第二个 delete[] 出错了。

如果您想要一个具有函数作用域的 foo 变量,请改为执行以下操作:

foo F(10);

另外,不要显式调用析构函数。 C++ 会在函数退出时调用它。

一般来说,每个管理内存的对象都应该定义一个复制构造函数和一个赋值运算符,或者禁止它们(通过将它们声明为私有)。

实际上,这很少需要,因为已经有大量的类可以为您管理内存,并且这样做是正确的。既然您正在学习,至少可以跳过所有的障碍,但在现实生活中,std::vector<int> 很乐意为您存储一组ints。

【讨论】:

  • 谢谢你的详细解释,这个超级有用!
  • "您的类没有定义复制构造函数,因此 C++ 按值复制它。在行尾,您最终会得到一个包含指向已删除数组的指针的对象." - 请参阅Rule of Three 以避免这种情况。
猜你喜欢
  • 2012-11-21
  • 1970-01-01
  • 2012-03-05
  • 2015-04-25
  • 1970-01-01
  • 2010-12-22
  • 1970-01-01
  • 2016-02-07
  • 2014-08-17
相关资源
最近更新 更多