c++ - 对 delete[] 的 Malloc 调用在 TotalView 中显示为内存泄漏

标签 c++ memory-leaks malloc delete-operator totalview

我正在使用 HDF5 将字符串读入由 new[] 分配的 char* 中。然后,我使用 string::assign() 调用将此数据复制到我真正想要的位置。然后我对该 char* 调用 delete[]。这显示为使用 TotalView 的内存泄漏的根源。它显示了 stdlibc++ 中 delete[] 下对 replace_safemutatecreatemalloc 的损坏调用。这是怎么回事,这真的是内存泄漏吗?我也在此处设置了 GLIBCXX_FORCE_NEW=1

下面是复制这种情况的示例代码。请注意,valgrind 显示没有泄漏,如果我不在 cout 调用之前放置断点,totalview 就不会发现泄漏。

#include <string>
#include <iostream>
#include <cstdlib>

int main()
{
    std::string str;

    int len = strlen(getenv("PATH"));
    char* x = new char[len + 1];
    strcpy(x, getenv("PATH"));
    x[len] = '\0';

    str.assign(x);

    delete[] x;

    std::cout << str << std::endl;
}

最佳答案

应该没问题:
但我建议使用 std::vector 而不是新建 char 数组:

std::vector<char>  x(len+1);
strcpy(&x[0], getenv("PATH"));

我这样做的原因是方法 allocate() 可能会抛出异常。因此,可能不会调用删除,因此在出现异常时可能会泄漏。使用您授予的 vector ,由于 RAII 的原因,内存会被清理。

关于c++ - 对 delete[] 的 Malloc 调用在 TotalView 中显示为内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1949237/

相关文章:

c++ - 为什么这段代码没有编译

ios - 尝试在已连接的 iPad 上运行 Xcode 7 Instruments、Allocations/Leaks 工具时收到错误 'Unable to attach to task; port invalid'

delphi - FastMM 在没有 FullDebugMode 的情况下记录到文件

C 从动态数组中删除元素

Linux 环境中 MS Windows 的 C++11 编译器

C++ 日历问题

c# - IDisposable 实现 - 'if (disposing)' 中应该包含什么

c - 我是 "have to"free() 静态动态分配指针吗?

c - C中使用malloc动态分配内存

c++ - 有没有办法在枚举中使用关键字作为标识符?