私はvalgrindの初心者ですので、何か間違っているかもしれませんが、valgrindがallocsより多くの解放を報告したらどうしたらいいですか? valgrindはallocsより多くの解放を報告します
はここSSCCEガット:罰金コンパイルして、あまりにも罰金を実行しますが、valgrindのは==15925== Invalid free()/delete/delete[]
==15925== at 0x40221EA: operator delete[](void*) (vg_replace_malloc.c:364)
==15925== by 0x8048689: something::~something() (test.cpp:12)
==15925== by 0x80485F5: main (test.cpp:19)
==15925== Address 0x42b7028 is 0 bytes inside a block of size 4 free'd
==15925== at 0x40221EA: operator delete[](void*) (vg_replace_malloc.c:364)
==15925== by 0x8048689: something::~something() (test.cpp:12)
==15925== by 0x80485E5: main (test.cpp:18)
==15925==
==15925== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 18 from 1)
==15925== malloc/free: in use at exit: 0 bytes in 0 blocks.
==15925== malloc/free: 1 allocs, 2 frees, 4 bytes allocated.
==15925== For counts of detected errors, rerun with: -v
==15925== All heap blocks were freed -- no leaks are possible.
言うと、私はなぜわからないんだ
#include <cstring>
class something
{
protected:
char* ptr;
public:
something() {ptr = NULL;}
something(const char* value) {
ptr = new char[strlen(value)+1]; strcpy(ptr, value);
}
~something() {delete[] ptr; ptr = NULL;}
};
int main()
{
something x;
x = "123";
return 0;
}
。
もちろん、私は教育的な推測をすることができます - 明らかに違反行は、それがx = "123";
と言う場所であり、あなたがそれをコメントすれば、すべてが良いです。しかし、なぜコンパイラは-Wall -Wextra -pedantic
を使っても、これが問題ないと思いますか?私はこのプログラムに問題があることを伝えるコンパイラスイッチを忘れてしまったのでしょうか?
間違いなく。しかし、私の最終的な質問は残っています。これらの種類のものを検出できる 'g ++ 'へのコンパイラスイッチがありますか? –
@MrLister:残念ながら、Rule of ThreeはC++標準の一部ではありません(理想的にはそうだったはずです)ので、コンパイラは違反していると不平を言うことはありません.AFAIKも、それについて報告するコンパイラの拡張はありません。 –