我在 C++ 中有以下结构:
struct wrapper
{
// Param constructor
wrapper(unsigned int _id, const char* _string1, unsigned int _year,
unsigned int _value, unsigned int _usage, const char* _string2)
:
id(_id), year(_year), value(_value), usage(_usage)
{
int len = strlen(_string1);
string1 = new char[len + 1]();
strncpy(string1, _string1, len);
len = strlen(_string2);
string2 = new char[len + 1]();
strncpy(string2, _string2, len);
};
// Destructor
~wrapper()
{
if(string1 != NULL)
delete [] string1;
if(string2 != NULL)
delete [] string2;
}
// Elements
unsigned int id;
unsigned int year;
unsigned int value;
unsigned int usage;
char* string1;
char* string2;
};
在 main.cpp 中,假设我为此结构的一个对象分配了内存:
wrapper* testObj = new wrapper(125600, "Hello", 2013, 300, 0, "bye bye");
我现在可以使用指针算法和指向其中一个结构元素的指针来删除整个对象吗?
像这样:
void* ptr = &(testObj->string2);
ptr -= 0x14;
delete (wrapper*)ptr;
我自己测试过,显然它有效,但我不能 100% 确定这等同于 delete testObj
。
谢谢。
最佳答案
从技术上讲,这样的代码可以工作(忽略 wrapper testObj
应该是 wrapper* testObj
并且偏移不一定是 0x14
,例如调试版本有时会填充结构,也许还有一些我错过的其他细节),但这是一个可怕的想法。我怎么强调它有多可怕都不为过。
您可以使用 offsetof
而不是 0x14
宏。
如果您喜欢在调试器的陪伴下度过夜晚,当然,请随意。
我假设这个问题的原因纯粹是好奇是否可以使用指针算法从成员导航到父级,而不是您真的想在生产代码中这样做。请告诉我我是对的。
关于c++ - 使用指针算法和指向该结构元素的指针释放结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16173007/