动态分配结构和铸造

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++中是非法的.

  • 仅仅因为您的代码编译不会使其成为合法代码. (5认同)
  • @Simone因为行为是未定义的,不知道编译代码可能会做什么.对于您的编译器,它似乎可行. (2认同)

Yac*_*oby 5

它可能(无法保证)在您的机器上正常工作,因为大多数实现delete(释放内存时)指针的类型与地址无关.由于它可能会释放为Bar分配的内存(在这种情况下).

但是,将delete视图扩展为以下内容:

if ( ptr != 0 ){
    ptr->~ClassName();
    operator delete(ptr);
}
Run Code Online (Sandbox Code Playgroud)

考虑将错误类型传递给的情况delete.调用错误的析构函数,这不会在编译时导致错误,但可能会在运行时导致问题.

考虑new和delete运算符重载的情况......