直接在C ++中释放对象

时间:2017-03-18 18:17:59

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

我是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;
}

这很有效,但如果我像这样写主要:

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

我最终会检测到“glibc”。我想我应该以某种方式解除分配“bar”指针,因为它是在构造期间分配的。

因此我的问题是如何解除这样的对象?感谢。

1 个答案:

答案 0 :(得分:3)

对于新的C ++开发人员来说,你的涉猎方式太深了。

该行

foo F = foo(10);

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

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

其余的很明显。第二个删除[]错误输出。

如果您想要一个带有功能范围的foo变量,请执行以下操作:

foo F(10);

而且,不要显式调用析构函数。当函数退出时,C ++将调用它。

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

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