使用指针算术和指向该结构的元素的指针释放该结构
Deallocate structure using pointer arithmetics and a pointer to an element of that structure
我在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
。
如果你喜欢在调试器的陪伴下过夜,当然,你可以这样做。
我将假设这个问题的原因纯粹是好奇是否可以使用指针算术从成员导航到父节点,而不是想在生产代码中真正这样做。请告诉我我是对的。
我现在可以使用指针算术和指向一个结构元素的指针删除整个对象吗?
理论上,是的。
你给delete
的指针需要有正确的值,无论这个值是来自一个现有的指针变量,还是通过这种方式"调整"一个指针变量,都没有关系。
char*
,这样你就可以以单个字节为单位移动。你当前的代码无法编译,因为ISO C++ forbids incrementing a pointer of type 'void*'
(void
有多大?)。
然而,我建议根本不要这样做。你的神奇数字0x14
是不可靠的,考虑到对齐和填充以及你的结构改变形状的可能性。
存储指向实际对象的指针。同时停止所有可怕的内存混乱,并使用std::string
。目前,缺少复制构造函数导致了一个严重的错误。
您可以使用指针算术来做这种事情。你是否应该是一个完全不同的故事。考虑这个宏(我知道…我知道…),它会给你一个结构的基地址,给定它的类型,结构成员的名字和指向该成员的指针:
#define ADDRESS_FROM_MEMBER(T, member, ptr) reinterpret_cast<T*>(
reinterpret_cast<unsigned char *>(ptr) - (ptrdiff_t)(&(reinterpret_cast<T*>(0))->member))
相关文章:
- 如何在 C# 中映射双 C 结构指针?
- C++:映射结构中的结构指针
- C++:添加新结构时,结构指针向量中的所有元素都会更新
- 类的静态结构指针声明在C++
- 在两个.cpp文件之间定义全局类/结构指针
- 返回对常量结构(指针类型)成员的引用:明显的左值到右值转换
- 是否可以将无符号字符数组reinterpret_cast到仅包含C++中无符号字符成员的结构指针
- 如何在地图中使用结构指针
- 结构指针在"新"调用上给出已分配的地址?
- 铸造结构指针指向C 的工会指针
- c++ 结构指针在初始化为 NULL 时无法读取内存
- 函数中的结构指针的地址为0x1
- C 用结构指针初始化结构
- C 结构指针铸成数组Interop C#
- 方法中不允许访问结构指针
- 如何打印出结构指针
- MPI_Op_create:候选功能不可行.自定义结构指针不能解释为空指针
- 尝试将结构指针传递给类时出错
- 初始化结构指针的值
- 使用 pybind11 将自定义结构(指针向量)从 C++ 传递到 python 的方法是什么?