c++ - 使用指针算法和指向该结构元素的指针释放结构

标签 c++ structure pointer-arithmetic

我在 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/

相关文章:

c++ - 在模板中定义友元函数的实例化

c++ - 段错误 : Why?

c - 尽管定义为 1,变量值仍然过长

在 c 中创建我自己的 memset 函数

c - 指针运算

c++ - 在 solaris 上链接 zeromq 静态库

c - 使用带结构的指针将数据传递给函数

c - 二进制文件中的结构体数组

c++ - 解决指针算术问题

c++ - 传递给函数时获取包含元素 0 的数组的长度