在C++中删除对象

Nim*_*ima 28 c++ memory-management object new-operator

这是我的示例代码:

void test()
{
   Object1 *obj = new Object1();
   .
   .
   .
   delete obj;
}
Run Code Online (Sandbox Code Playgroud)

我在Visual Studio中运行它,它在'delete obj;'的行中崩溃.这不是释放与对象关联的内存的正常方法吗?我意识到它会自动调用析构函数......这是正常的吗?


这是一段代码:

    if(node->isleaf())
    {
        vector<string> vec = node->L;
        vec.push_back(node->code);
        sort(vec.begin(), vec.end());

        Mesh* msh = loadLeaves(vec, node->code);

        Simplification smp(msh);

        smp.simplifyErrorBased(errorThreshold);

        int meshFaceCount = msh->faces.size();

        saveLeaves(vec, msh);

        delete msh;
    }
Run Code Online (Sandbox Code Playgroud)

loadleaves()是一个从磁盘读取网格并创建一个Mesh对象并返回它的函数.(想想vec并且node->code只是有关要打开的文件的信息)

我应该删除该delete msh;线路吗?

Jam*_*lis 37

这不是释放与对象关联的内存的正常方法吗?

这是管理动态分配内存的常用方法,但这不是一种好方法.这种代码很脆弱,因为它不是异常安全的:如果在创建对象和删除对象之间抛出异常,则会泄漏该对象.

使用智能指针容器会更好,您可以使用它来获取范围限制资源管理(它通常称为资源获取是初始化,或RAII).

作为自动资源管理的示例:

void test()
{
    std::auto_ptr<Object1> obj1(new Object1);

} // The object is automatically deleted when the scope ends.
Run Code Online (Sandbox Code Playgroud)

根据您的使用情况,auto_ptr可能无法提供您需要的语义.在这种情况下,您可以考虑使用shared_ptr.

至于为什么你的程序在删除对象时崩溃,你没有给出足够的代码,任何人都无法确定地回答这个问题.

  • 这仍然是正确答案吗?显然 auto_ptr 现在已被弃用。/sf/ask/168288081/ 管理员可以编辑这个答案吗? (4认同)

Ale*_*lli 7

您的代码确实使用常规方法来创建和删除动态对象.是的,完全正常(并且确实由语言标准保证!)delete将调用对象的析构函数,就像new调用构造函数一样.

如果你没有Object1直接实例化它的某些子类,我会提醒你,任何想要继承的类都必须有一个析构函数(这样就可以在类似于这个的情况下调用正确的子类的析构函数) - 但是如果您的示例代码确实代表了您的实际代码,那么这可能不是您当前的问题 - 必须是其他内容,可能是您未向我们展示的析构函数代码,或者您未显示的代码中的某些堆损坏在那个功能或它所称的那个......?

顺便说一句,如果您在退出实例化它的函数之前总是要删除对象,那么使该对象动态化没有意义 - 只需将其声明为本地(存储类auto,默认情况下)变量功能!