直接在 C++ 中释放对象

Gao*_*han 2 c++ memory-management object 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;
}
Run Code Online (Sandbox Code Playgroud)

这工作得很好,但如果我这样写 main :

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

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

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

Sev*_*yev 6

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

线路

foo F = foo(10);
Run Code Online (Sandbox Code Playgroud)

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

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

其余的都是显而易见的。第二个delete[] 出错。

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

foo F(10);
Run Code Online (Sandbox Code Playgroud)

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

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

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