2

私はHDF5を使用して、char*によって割り当てられた文字列に文字列を読み込みますnew[]。次に、string ::assign()呼び出しを使用して、このデータを実際に必要な場所にコピーします。delete[]次に、そのchar*を呼び出します。これは、totalviewを使用したメモリリークの原因として表示されています。stdlibc ++で、、、、、およびの間にマングルされた呼び出しが表示delete[]されます。何が起こっているのですか、これは本当にメモリリークですか?私もここに設定しました。replace_safemutatecreatemallocGLIBCXX_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;
}
4

2 に答える 2

3

それは問題ないはずです:
しかし、charの配列を新しくするのではなく、std ::vectorを使用することをお勧めします:

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

これを行う理由は、メソッドassign()が例外をスローする可能性があるためです。そのため、deleteが呼び出されない可能性があり、例外が存在する場合にリークする可能性があります。被付与者に付与されたベクトルを使用すると、RAIIのためにメモリがクリーンアップされます。

于 2009-12-22T21:31:56.003 に答える
2

リークとは関係ありませんが、長さがわかっている場合strncpystrcpy

于 2009-12-22T21:39:41.073 に答える