【问题标题】:std::vector in MyClass ptr causing crash on destructorMyClass ptr 中的 std::vector 导致析构函数崩溃
【发布时间】:2015-12-17 09:58:56
【问题描述】:

我对我制作的自定义类有疑问。最初的意图是创建一个粒子发射器,在这个发射器中有两个向量来保存颜色和粒子本身。

问题正是试图破坏这个自定义类,如果你不调用析构函数,它会完美运行,这显然很糟糕。

我已将其简化为一个非常简短的可编译示例。

测试.h

#include <vector>
class Test{
public:
    Test();
    ~Test();
protected:
    std::vector<int> Ints;
};

还有main.cpp:

#include "Test.h"
int main(int argc, char **argv){
    Test* t;
    delete[] t;
    return 0;
}

在实现文件中只是空的构造函数和析构函数。

需要注意的是,这只发生在“测试”是指针时,最好避免。

如有需要,将提供更多信息。提前致谢。

【问题讨论】:

    标签: class pointers c++11 vector


    【解决方案1】:

    您正在删除尚未分配内存的内容,而且方式也不正确。

    先分配内存

    Test *t = new Test;
    

    那么,

    delete t; // Note no []
    

    另外,由于C++11 已被标记,因此更喜欢使用智能指针,它会自行为您进行内存管理

    【讨论】:

    • 这就是我要找的。谢谢你。另外,我的原始程序中确实有 new 关键字,只是在示例中忘记了它。我可以问什么时候使用 [] 与不使用 [] 吗?
    • delete [] 用于删除对象数组,因此仅当您执行 T *p = new T[count] 时。通常最好避免使用,除非在类的实现中 - 改用 std::vector
    • @KnightRaven 每当您将[]new 一起使用时。规则是使用new [] 分配的任何内容都应使用相应的delete [] 释放,仅newdelete 相同。在 SO 上搜索,您将获得大量信息。
    • 好的。谢谢你们俩。我养成了 delete[] 的习惯,这是我使用它时遇到的第一个问题。以后我会更加小心。我还将研究智能指针。
    • 建议堆栈存储,或者至少,unique_ptr 会更加安全
    【解决方案2】:

    如果t 是一个指针,那么你需要先给它一些指向的东西,正如@P0W 指出的那样。但是为什么不直接将t 声明为本地(堆栈)变量呢?

    #include "Test.h"
    int main(int argc, char **argv){
        Test t;
        return 0;
    }
    

    【讨论】:

    • 原因是因为 t 需要在其构造函数中接受变量,我不想使用初始化列表,因为在初始化它之前必须完成工作。
    • 也许是您尝试做的更完整的示例? (您的帖子似乎表明您希望避免使用指针。)正如@P0W 所指出的,您必须在删除它之前分配一个对象(如果您使用new 分配它),并且您需要删除它具有正确的删除(或使用通常首选的智能指针)。但是,如果您延迟创建对象,直到您完成其他设置之后,那么您可以在此时将对象放入堆栈。
    【解决方案3】:

    您没有创建对象测试。您已经创建了一个 Test 类型的指针。对于指针,您需要使用关键字“new”。

    Test * t = new Test();

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-13
      • 1970-01-01
      • 2016-11-04
      • 1970-01-01
      • 2011-06-12
      • 2021-06-18
      • 1970-01-01
      • 2013-03-14
      相关资源
      最近更新 更多