2014-07-22 50 views
0

我有这个代码的一些问题:C++删除问题动态分配内存

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 *pv = v; 

是正确的

delete pv; 

delete [](char*) pv; 
+2

1.未定义的行为。 – chris

回答

0

new[]的调用需要在相同的存储器地址上调用delete[]并使用相同的指针类型进行匹配。

new的调用需要在同一内存地址上调用delete并使用相同的指针类型进行匹配。

如果你混淆了,那么你调用未定义的行为,并最终会有问题。

由于某些编译器如何实现动态分配的内存,在某些简单情况下,您可能偶尔会“幸运”并放弃它,但这仍然是一个坏主意,随时可能会崩溃。如果使用具有析构函数的类类型尝试此操作,那么通常会导致析构函数无法在某些或所有实例上正常运行。但是当然还有其他的可能性,比如堆腐败。

所以一个new char[]声明的结果必须可以通过delete[]声明char*类型的指针释放。

+0

感谢responde so delete [](char *)pv;是正确的 ? – WilD

+0

@Pepe是的,如果你真的需要在那里有一个void指针,那么使用该类型是正确的方法。 – TheUndeadFish

0

究竟是什么你试图删除,char *vvoid *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,您必须将void指针初始化为new这样的:

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

+0

感谢您的回应,但在第二我想删除无效* pv – WilD

+0

我有问题的大小,因为void *指向第一个字节,但我想删除所有分配的空间。 – WilD

+0

@Pepe尝试我刚添加的代码。 –

0

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

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

然后

delete v; 

调用未定义的行为。你需要做delete[] v,然后你不能再使用pp,因为它指向的东西已被删除。

1

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

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

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

so删除选项适用于这两种类型的数据类型。

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