C++ C++;从分配存储空间的位置删除不同功能中的存储空间

C++ C++;从分配存储空间的位置删除不同功能中的存储空间,c++,C++,如果从最初分配的存储空间中删除另一个函数中的存储空间,是否会出现未定义的行为 typedef struct { unsigned int Data1; unsigned int Data2; unsigned int Data3; }TData; void CreateStorage(void) { TData *TempData = new TData; DeleteStorage((unsigned char*)TempData); } voi

如果从最初分配的存储空间中删除另一个函数中的存储空间,是否会出现未定义的行为

typedef struct {
    unsigned int Data1;
    unsigned int Data2;
    unsigned int Data3;
}TData;

void CreateStorage(void)
{
    TData *TempData = new TData;

    DeleteStorage((unsigned char*)TempData); 
}

void DeleteStorage(unsigned char *StorageToDelete)
{
    delete (TData*)StorageToDelete;
}
没有


[注意:您不需要该强制转换。]

从不同函数分配和删除内存是完全有效的

不,没关系。
为什么要将StorageToDelete强制转换为DeleteStorage()中的(TData*)?

不,没关系,也不键入定义结构。只需说
struct TData{/*…*/}

只要您在同一个库中分配和取消分配,它就会被安全地删除

但是,如果您在不同的库中分配和取消分配,则需要注意一些事情。由于不同库之间的基础类定义可能不同,因此需要确保使用相同的定义


<> P>一个非常常见的问题是当你使用一个预编译的开源C++库和你的程序,而库使用不同的C++运行时库,当开源库释放程序分配的STL容器实例时,它有时会崩溃,因为开源库中该类的定义与您的不同。解决此问题的常见解决方法是使用您使用的编译器重新编译开源库。

我使用的是QT。存储指针实际上是作为一个事件传递给另一个函数:@user668773如果该存储的析构函数仅在库中定义,那么就可以了。我正在使用QT。存储指针实际上作为事件传递给另一个函数(emit signalDeleteStorage)。我不允许在信号事件中传递未定义的类型。因此,我将指针作为已知类型unsigned char传递。TData是未知的,因此当我传递它时,我将它转换为无符号字符。为了确保编译器知道要取消分配的内存大小,我将其转换回原始类型。这是没有必要的吗?对不起,我误解了;我将删除第二点。实际上,
delete
将调用析构函数,因此您应该为它指定正确的类型。不是因为内存释放(这应该没问题),而是因为对象破坏。不过,您应该将这样一个“无类型”指针作为
void*
来传递,只是为了保持整洁,比如说
delete static\u cast(StorageToDelete)
。使用类型定义结构的原因可能是由于坏习惯,也可能是由于我的编程风格。我经常传递结构作为指向其他函数的指针。无需太多麻烦,我现在可以在传递指针时使用函数参数列表中的类型定义结构。这样,在对结构指针进行操作时不需要强制转换。当然,给出的示例不适用,因为它是作为无符号字符传递的,但在所有其他情况下,我将按结构类型传递它?他分配了一个TData,如果没有强制转换,他将删除一个未签名的字符。如果静态类型与动态类型不匹配,则删除时会出现未定义的行为。@DietmarKühl:问题已编辑。最初,任何地方都没有
无符号字符*
。。。