带有std::string的内存泄漏
Memory leak with std::string
以下代码:
#include <string>
void *ptr = nullptr;
std::string *p = new std::string();
*p = "1";
ptr = p;
delete ptr;
似乎通过以下输出造成内存泄漏:
21: Detected memory leaks!
21:转储对象->
21:{706}正常块位于0x00723860, 8字节长。
21: Data: <问在C8 _x0030_4=" _x0037_1=" _x0030_00=">问在C8>
21: Object dump complete.
很奇怪,因为下面的代码显示没有错误(也适用于double, bool):
void *ptr = nullptr;
int *p = new int();
*p = 1;
ptr = p;
delete ptr;
你知道我做错了什么吗?(我需要使用void *"指针,因为它可以保存不同类型的对象)。非常感谢那些可以帮助我的人!!:)
(假设您指的是ptr = p
)。
如果将void *
传递给delete
,则不调用析构函数。
(编译器甚至无法知道是否存在,因此无法调用它。)
由于std::string
内部持有一个动态分配的缓冲区,如果不调用析构函数,该缓冲区将泄露。
您需要通过模板、boost::any
(带有虚析构函数的公共基类)或手动记账来维护"适当的"指针。
根据c++标准
操作数必须是指向对象类型或类类型的指针。如果的类类型时,操作数被上下文隐式转换(子句)4)指向对象类型的指针
在脚注中还写着
81)这意味着不能使用的指针删除对象键入void*,因为void不是对象类型。
所以程序的行为是未定义的。由于对象的大小未知,既不调用std::string
类型对象的析构函数,也不调用操作符delete函数。
相关文章:
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 尽管遵循了规则,内存泄漏在哪里
- 为什么调用堆栈数组会导致内存泄漏
- 在简单示例中,Python3 + ctypes 回调会导致内存泄漏
- 使用模板类的自定义列表类型中的内存泄漏
- 为什么以下C++代码中存在内存泄漏?
- OpenCV 我应该使用智能指针来防止内存泄漏吗?
- 我是否生成线程并导致内存泄漏?
- 多线程程序中出现意外的内存泄漏
- 为什么此函数会导致内存泄漏?
- 在 C++ 库中使用cythonized python时内存泄漏
- 需要帮助查找内存泄漏
- 瓦尔格林德的内存泄漏使用新的
- 无法找出我的代码中的内存泄漏
- C++ 结构内部的unordered_map会导致内存泄漏问题吗?
- 可视化 使用 VS Code 查找C++应用程序中的内存泄漏
- Shared_ptr双链接列表内存泄漏
- C++ 在类中使用常量引用文本时 O2 内存泄漏