繁体   English   中英

在C ++向量中取消分配内存<T>

[英]Deallocating memory in C++ vector<T>

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

// 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;
}

我是否正确地认为,由于对于new每次调用都没有相应的delete调用,所以该程序确实会泄漏内存?

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

是的,你是对的。 而且,您的代码属于“非常努力地将其弄成错误”的类型,因为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()
}

幸运的是,几乎总是很明显,您正在做不应该做的事情。

对,那是正确的。 您不会取消分配对new所做的分配。 另外,您不需要在已经动态的容器内进行动态分配。

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

使用此代码填充V向量

V.push_back(CTest(U));

会做需要的事情,没有任何泄漏。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM