我对此代码有一些问题:
1)如果删除第一个单元格,为什么输出会返回垃圾?
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;
答案 0 :(得分:1)
我认为你要做的是释放动态分配的内存.. 首先,指针始终是int的大小。
它只处理数据位置(引用)。 char指针可以存储char类型变量的地址。
void指针可以存储任何数据类型的地址。
所以删除选项适用于两种类型的数据类型。
它只是释放空间并使其在堆上可用
答案 1 :(得分:0)
您要删除的确切内容是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** pv = new(void*); // Create a void pointer using new
pv = (char *)v;
delete pv;
答案 2 :(得分:0)
您不能只删除动态分配的数组中的一个元素。如果您使用new[]
分配数组,则只能删除整个数组,并且必须使用delete[]
,而不是delete
。
否则
char *v = new char[sizeof(int)];
然后
delete v;
调用未定义的行为。您需要执行delete[] v
,然后您才能再使用pp
,因为它指向已被删除的内容。
答案 3 :(得分:0)
对new[]
的调用需要通过在同一内存地址上调用delete[]
并使用相同的指针类型来匹配。
对new
的调用需要通过在同一内存地址上调用delete
并使用相同的指针类型来匹配。
如果你混淆了,那么你正在调用未定义的行为并最终会出现问题。
也许你偶尔会“幸运”并在某些简单的情况下逃脱它,因为某些编译器已经实现了动态分配的内存,但它仍然是一个坏主意并且可能随时中断。如果您尝试使用具有析构函数的类类型,那么一个常见的后果是析构函数将无法在某些或所有实例上正确运行。但当然还有其他可能性,例如堆损坏。
所以new char[]
语句的结果必须在类型为delete[]
的指针上由char*
语句释放。