C 内存泄漏与类成员
C++ memory leak with class members
vs2010中的debug_vld揭示了来自类成员创建/初始化/删除的一些内存泄漏。
my_member
是具有双重类型*的数据成员。在构造函数中,我有
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>
是首选的方法,但是如果您想拥有RAW double*
并写下复制构造函数,请手动移动constructor和 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;
}
};
如果代码中还有其他位置,您将my_member
设置为NULL
而不调用delete[]
,则是。如果您不遵守三个规则(正确实现的复制构造函数和分配运算符),则会遇到各种麻烦。
为了防止这种情况,请改用std::vector<double>
,您可以在哪里进行:
void MyClass::my_method()
{
my_member.resize(n_dim); // yay, learned something new here
for(int k = 0 ; k < n_dim ; k++ )
my_member[k] = k ;
}
这样,您就不会管理内存,因此不需要驱动器(除非是virtual
,在这种情况下,它可以为空)。
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- valgrind-hellgrind与泄漏检查的结果不同
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 助记符和指向成员语法的指针
- 用于访问容器<T>数据成员的正确 API
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 使用初始值设定项列表的初始化类成员会导致内存泄漏
- 是标头文件中使用“新”定义的成员指针泄漏
- 为什么静态类成员没有内存泄漏错误?
- 没有任何数据成员的类会导致内存泄漏吗?
- C 内存泄漏与类成员
- C++ 移动构造函数和常量成员指针或常量成员,如何对它们进行 NULIZE 以避免内存泄漏
- Valgrind在使用字符串类型成员(使用nvcc编译)时识别内存泄漏
- 创建std::shared_ptr来分配成员变量时内存泄漏
- 以多态方式使用派生类的std::vector成员的复制赋值会导致内存泄漏
- 分配函数作用域成员是否会导致内存泄漏