Sim*_*lli 2 c++ memory-leaks operators
假设我有这样的第一个结构:
typedef struct {
int ivalue;
char cvalue;
}
Foo;
Run Code Online (Sandbox Code Playgroud)
第二个:
typedef struct {
int ivalue;
char cvalue;
unsigned char some_data_block[0xFF];
}
Bar;
Run Code Online (Sandbox Code Playgroud)
现在让我们说我做了以下事情:
Foo *pfoo;
Bar *pbar;
pbar = new Bar;
pfoo = (Foo *)pbar;
delete pfoo;
Run Code Online (Sandbox Code Playgroud)
现在,当我调用delete操作符时,它释放了多少内存?
sizeof(int) + sizeof(char)
Run Code Online (Sandbox Code Playgroud)
要么
sizeof(int) + sizeof(char) + sizeof(char) * 0xFF
Run Code Online (Sandbox Code Playgroud)
?
如果这是由于铸造的第一种情况,有没有办法防止这种内存泄漏发生?
注意:请不要回答"使用C++多态"或类似的,我使用这种方法是有原因的.
小智 9
释放的内存量未定义 - 您的代码在C++中是非法的.
它可能(无法保证)在您的机器上正常工作,因为大多数实现delete(释放内存时)指针的类型与地址无关.由于它可能会释放为Bar分配的内存(在这种情况下).
但是,将delete视图扩展为以下内容:
if ( ptr != 0 ){
ptr->~ClassName();
operator delete(ptr);
}
Run Code Online (Sandbox Code Playgroud)
考虑将错误类型传递给的情况delete.调用错误的析构函数,这不会在编译时导致错误,但可能会在运行时导致问题.
考虑new和delete运算符重载的情况......