在C ++向量<t> </t>中释放内存

时间:2012-03-17 01:03:33

标签: c++ memory-leaks

以下是我现在可以构建的最佳“最小工作示例”。我想了解以下代码是否会泄漏内存。

// Class CTest
class CTest {
  vector<int> Elements;
  CTest (vector<int>&);
  ~CTest ();
};
CTest::CTest (vector<int>& Elements_) {
  this->Elements = Elements_;
}
CTest::~CTest () {
}

// main
int main (int argc, char *argv[]) {
  vector<CTest> V;
  for (auto i = 0; i < 10; i++) {
    vector<int> U;
    for (auto j = i; j < i + 5; j++) U.push_back (j);
    V.push_back (*(new CTest (U)));
  }
  // Do whatever
  return 0;
}

我是否认为因为delete的每次调用没有相应的new调用,这个程序确实泄漏了内存?

4 个答案:

答案 0 :(得分:9)

是的,存在内存泄漏。 push_back复制其参数,因此原始文件永远丢失(不再指向它)。

答案 1 :(得分:3)

是的,你是对的。此外,您的代码类似于“非常努力地弄错”,因为vector已经是动态容器,您没有理由为您的元素执行另一个动态分配(只是为了复制它。。

还有很多方法搞砸了。这些都不是C ++的特定设计问题,但是语言可以阻止你做什么只是一个限制。还有一些例子:

int main(int argc, char **argv)
{
    new double;  // leak
    delete static_cast<void*>(&argc);  // doesn't belong to you
    int a = *static_cast<int const *>(0x42); // not a valid pointer

    { T x; x.~T(); }  // call destructor of non-existent object

    { T y; y.~T(); new (static_cast<void*>(&y) T(); }
                   // impossible to recover from exception in T::T()
}

幸运的是,你做的事情几乎总是很明显。

答案 2 :(得分:0)

是的,这是正确的。您不会取消分配使用new进行的分配。此外,您不需要在已动态容器中进行动态分配。

答案 3 :(得分:0)

是的,它正在泄漏但只是因为你太努力了。

使用此代码填充V向量

V.push_back(CTest(U));

将做任何需要,没有任何泄漏。

通常,标准容器将为您管理内存(无泄漏)。你不必费心。