【问题标题】:Destructor for primitive type dynamically allocated array?原始类型动态分配数组的析构函数?
【发布时间】:2012-02-29 03:35:08
【问题描述】:

如果我想删除一个动态分配的原始类型值数组:

int *it = new int[10]

我是否只是将delete [] it 放入析构函数中以确保正确释放内存?

意识到,由于指针是原始类型,删除动态分配的数组是否需要在析构函数中执行类似的操作:

for (size_t idx = 0; idx != 5; ++idx)
        delete sp[idx];
    delete[] sp;

我对此感到很困惑,因为我的程序中有很多与内存相关的错误。

【问题讨论】:

    标签: c++ memory-leaks memory-management destructor


    【解决方案1】:

    如果你有:

    int* it = new int[10];
    

    delete的正确方法是:

    delete[] it;
    

    如果你有一个这种类型的成员变量,你需要实现一个复制构造函数和赋值操作符,因为它们的默认版本是不够的,或者使类不可复制。

    由于这是 C++,我建议改用 std::vector<int>,因为这将为您处理内存管理。

    【讨论】:

      【解决方案2】:

      如果您要使用newdelete,则要遵循的一般规则是:使用与news 一样多的deletes。

      在您的情况下,您只调用了一次 new[]。你应该只调用一次delete[]

      顺便说一句,如果您曾经将指针存储在成员变量中,请考虑Rule of Three

      我说“如果你打算使用newdelete”,因为你通常不应该这样做。使用 RAII 技术和标准容器,完全可以编写非常有用的程序,而不会直接调用 newdelete

      如果您尝试维护ints 数组,请使用std::vector

      class MyClass {
          std::vector<int> it;
      
          void SomeFun() { it.resize(10); }
      };
      

      然后,在你的析构函数中,什么都不做。完全没有你的帮助,向量就会消失。

      【讨论】:

        猜你喜欢
        • 2017-06-06
        • 2013-03-20
        • 2022-10-14
        • 2017-01-18
        • 1970-01-01
        • 2010-09-15
        • 2015-01-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多