new和delete的指针类型必须一致,否则会造成未定义行为
2015-01-22 17:58
232 查看
class CC{ ... };
class CMyClass{
public:
CMyClass()
{
m_p=(CC *)new CC;
}
~CMyClass()
{
delete m_p;
}
private:
void * m_p;
};
若类CC包含有一个non-trivial的析构函数比如含有一个string成员,就可能会造成内存泄漏。
因为是这样的:
+----------------------------+--------------------+---+
m_p -> | Your object | string member | p |
+----------------------------+--------------------+-+-+ +--------
+---->| .....
+--------
当delete m_p 的时候,如果是用自己的类型,那么析构函数会被调用,
然后析构函数调用 string member 的析构函数,它再去释放自己管理的其他内存
如果用 void * 来回收内存,那么没有机会调用CC的析构函数,
string 管理的内存自然也没人来释放了
class CMyClass{
public:
CMyClass()
{
m_p=(CC *)new CC;
}
~CMyClass()
{
delete m_p;
}
private:
void * m_p;
};
若类CC包含有一个non-trivial的析构函数比如含有一个string成员,就可能会造成内存泄漏。
因为是这样的:
+----------------------------+--------------------+---+
m_p -> | Your object | string member | p |
+----------------------------+--------------------+-+-+ +--------
+---->| .....
+--------
当delete m_p 的时候,如果是用自己的类型,那么析构函数会被调用,
然后析构函数调用 string member 的析构函数,它再去释放自己管理的其他内存
如果用 void * 来回收内存,那么没有机会调用CC的析构函数,
string 管理的内存自然也没人来释放了
相关文章推荐
- VC6下深入理解new[]和delete[](在多线程下new和delete的时候,必须选择上多线程库,不然可能造成进程崩溃)
- C++ 学习笔记(19)new/delete表达式、定位new、typeid、dynamic_cast、type_info、枚举类型、成员函数指针、union、位域、volatile限定符、链接指示
- .NET 自动垃圾管理(垃圾收集)、安全类型验证、丰富的调试支持、一致的方法出错行为、安全性、互操作性
- SSAS事实表和维度表数据类型必须一致
- 删除(delete)空指针是安全的=>指针初始化为0或有效内存(new)
- new、delete、指向连续空间的指针、数组、空间释放、空间申请[C++][内存管理]
- Thinking in C++ ----第13, 14, 15章(new和delete操作符的行为、虚函数的特殊情况)
- 指针⑶,new和delete
- new与delete必须成对使用吗?
- 指针类型与对象类型一致
- [C/C++][经典探讨]类继承中,通过基类指针delete释放,是否会造成内存泄漏
- 一维静态指针和一维new分配的动态指针,均不可以delete.
- SSAS事实表和维度表数据类型必须一致
- new、delete、指向连续空间的指针、数组、空间释放、空间申请
- 指针学习1--new &delete & destructor
- 使用指针类型参数和使用指针引用类型参数在函数内部用new给参数分配空间的不同结果
- new、delete、指向连续空间的指针、数组、空间释放、空间申请[C++][内存管理]
- new、delete、指向连续空间的指针、数组、空间释放、空间申请[C++][内存管理]
- C++中关于原始数据类型指针变量的new操作以及delete操作
- 在C++动态库中释放调用动态库程序中生成的指针new和delete 或 malloc和free