类成员的 C++ 内存泄漏

标签 c++ memory memory-management memory-leaks constructor

VS2010 中的 Debug_VLD 揭示了一些来自类成员创建/初始化/删除的内存泄漏。

my_member 是一个 double* 类型的数据成员。在构造函数中,我有

my_member = NULL ;

然后在某些方法中,我需要为my_member 分配内存。我不能在构造函数中这样做, 因为我还不知道数组的大小,和/或大小可能因方法的不同调用而不同。我在这个方法中所做的是检查成员是否为 NULL。如果是这样,我为它分配空间,如果不是,我可以对数组进行操作(使用accesor []更改其元素的值)。看起来像

void MyClass::my_method()
{
    if( my_member == NULL )
        my_member = new double[n_dim] ;

    for(int k = 0 ; k < n_dim ; k++ )
         my_member[k] = k ;
}

内存泄漏发生在 my_member = new double[n_dim] ; 行。

在析构函数中,我有

delete[] my_member ;

怎么了?如何正确分配?

谢谢!

最佳答案

使用 std::vector<double>是首选方式,但如果您想要原始 double*并编写复制构造函数、移动构造函数和operator= “手动”,你应该做这样的事情:

#include <assert.h>  // for assert

#include <algorithm> // for std::swap

class MyClass
{
  //
  // Raw array
  //
  double * m_ptr; // raw pointer
  size_t m_dim;   // number of items in the array

public:

  // Default constructor - creates empty vector
  MyClass()
    : m_ptr(nullptr)
    , m_dim(0)
  {
  }


  // Copy constructor
  MyClass(const MyClass& src)
    : m_ptr(nullptr)
    , m_dim(0)
  {
    // Special case of empty source
    if (src.m_dim == 0)
    {
      assert(src.m_ptr == nullptr);
      return;
    }

    // Allocate and deep-copy from source
    m_ptr = new double[src.m_dim];
    m_dim = src.m_dim;
    for (size_t i = 0; i < m_dim; i++)
      m_ptr[i] = src.m_ptr[i];
  }

  // Move constructor: steal the "guts" from src
  MyClass(MyClass&& src)
  {
    m_ptr = src.m_ptr;
    src.m_ptr = nullptr;

    m_dim = src.m_dim;
    src.m_dim = 0;
  }

  // Destructor
  ~MyClass()
  {
    delete [] m_ptr;
  }

  // Unified operator=
  MyClass& operator=(MyClass src)
  {
    std::swap(m_ptr, src.m_ptr);
    std::swap(m_dim, src.m_dim);
    return *this;
  }
};

关于类成员的 C++ 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13017946/

相关文章:

c++ - Clang Format多行格式配置错误

c++ - c/c++中指针的内存开销

memory - 如何确定 OpenCL 中的可用设备内存?

java - 无法让 Mule 3.4.0 使用超过 4GB 的内存

c++ - 如何将方法指针传递给结构(在 C/C++ 中)?

c++ - 行尾字数统计 (C++)

c++ - 使用 Boost 访问解析 XML 并填充属性树

memory - 缓存行如何工作?

android - 我必须删除 GLSurfaceView 中的纹理吗?

c++ - C++段错误问题