c++删除动态分配内存的问题

C++ delete problems dynamically allocated memory

本文关键字:问题 内存 动态分配 删除 c++      更新时间:2023-10-16

我对这段代码有一些问题:

1)如果我删除第一个单元格,为什么输出返回trash ?

int b = 1025;
char *v = new char[sizeof(int)];
memcpy(v,&b,sizeof(int));
char *pp = (char*)v;    
++pp;
delete v; // is equal delete &v[0]
cout<<"salida"<<*pp; 

2)如何删除动态分配的内存,当我有void*…

void *pv = v;

是正确的

delete pv;

delete [](char*) pv;

我认为你要做的是释放动态分配的内存。首先,指针总是int型的大小。

只处理数据位置(引用)。char指针可以存储char类型变量的地址。

void指针可以存储任何数据类型的地址。

so delete选项对两种数据类型都有效。

它只是释放空间并使其在堆上可用

new[]的调用需要与对delete[]的调用匹配,在相同的内存地址上使用相同的指针类型

调用new需要匹配调用delete在相同的内存地址和使用相同的指针类型。

如果你把事情弄混了,那么你就调用了未定义的行为,最终会出现问题。

也许你偶尔会"幸运"地在某些简单的情况下使用它,因为某些编译器实现了动态分配的内存,但这仍然是一个坏主意,随时都可能崩溃。如果您尝试使用具有析构函数的类类型,那么一个常见的结果是析构函数将无法在某些或所有实例上正确运行。当然还有其他的可能性,比如堆损坏。

因此new char[]语句的结果必须由delete[]语句在类型为char*的指针上释放

不能只删除动态分配数组中的一个元素。如果你用new[]分配一个数组,你只能删除整个数组,你必须使用delete[],而不是delete

char *v = new char[sizeof(int)];

delete v;

调用未定义的行为。您需要执行delete[] v,然后您不能再使用pp,因为它指向已删除的内容。

您到底要删除的是char *v还是void *pv ?

如果要删除char *v

delete[] v; v = NULL; // v still exists, but it's a dangling pointer now, so we set it to NULL (or 0)

通常当你想要delete某事时,它必须与new配对。所以我认为如果你想删除void *pv,你必须像这样初始化指向new的void指针:

void** pv = new(void*); // Create a void pointer using new pv = (char *)v; delete pv;