gpt4 book ai didi

类成员的 C++ 内存泄漏

转载 作者:行者123 更新时间:2023-11-30 01:25:02 26 4
gpt4 key购买 nike

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com