c++删除动态分配内存的问题
C++ delete problems dynamically allocated memory
我对这段代码有一些问题:
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;
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 为什么瓦尔格林德在不释放恶意内存后没有报告任何问题?
- 包含矢量指针的结构的内存释放问题
- 在函数中分配内存时出现问题
- C++ 结构内部的unordered_map会导致内存泄漏问题吗?
- 使用 NTAllocateVirtualMemory 和 GetProcAddress 的内存分配问题不起作用
- 释放内存(主题模板)时出现问题
- C++ 中 std::vector 的内存问题
- C++ DLL 堆内存分配问题
- 在我的以下代码中获取 MLE(内存限制错误).尝试解决 ROUND C 2019(问题 A-摆动行走)启动问题
- 字符 * 未从重载运算符或内存管理问题正确返回
- delete[]有问题,如何部分删除内存
- 内存泄漏问题
- 指向动态内存中结构中的变量时出现问题
- c++中的内存管理问题
- C++堆栈内存管理问题
- 为什么我的C 代码在Linux上运行,而在Windows上不运行,是否有RAM内存的问题
- JNA 参数问题:内存访问无效
- boost的问题::内存映射~500MB,外部USB文件