2
classA objA (0, NULL);
classA & objB (objA);

上記がグローバルであると仮定すると、メモリリークが発生する可能性がありますか? 理由は?

実際に Valgrind を使用すると、エラーが発生します。

5 bytes in 1 blocks are still reachable
...
global constructors keyed to classA

それは何を示していますか。

アップデート:

正確なエラーはここにあります。

at 0x4C2659D: malloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==6653==    by 0x4EA7BB7: newterminal (in /usr/lib64/R/lib/libR.so)
==6653==    by 0x4EA7D4E: Rf_InitConnections (in /usr/lib64/R/lib/libR.so)
==6653==    by 0x4F420DD: setup_Rmainloop (in /usr/lib64/R/lib/libR.so)
==6653==    by 0x4FEC76A: Rf_initEmbeddedR (in /usr/lib64/R/lib/libR.so)
==6653==    by 0x5C3A8DB: RInside::initialize(int, char const* const*, bool) (in /usr/lib64/R/library/RInside/lib/libRInside.so)
==6653==    by 0x5C3AF60: RInside::RInside(int, char const* const*, bool) (in /usr/lib64/R/library/RInside/lib/libRInside.so)
==6653==    by 0x40D105: global constructors keyed to R
4

2 に答える 2

2

オブジェクト自体は動的に割り当てられないため、リークされません。

ただし、上記の場合、次のようなメモリ リークが発生する可能性があります。

class classA
{
   classA() { new int[42]; }
};

これは、デストラクタを提供するか、RAII を使用することで修正できます。

于 2012-12-06T07:11:43.557 に答える
2

いいえ、電話したことはないnewので、電話する必要はありませんdelete

delete動的に割り当てられたオブジェクトに対してのみ呼び出す必要があります。オブジェクトは動的に割り当てられないため、その必要はありません。これを行うと、未定義の動作が発生します。

class Aもちろん、メモリをリークしたり、未定義の動作を引き起こしたりするコンストラクターがないと仮定することは明らかであり、かなり自然です。


また、メモリリークと見なされるものは解釈の余地があることに注意してください。

あなたの場合、問題のオブジェクトはグローバルであり、プログラムの存続期間中存続することが保証されています。このオブジェクトがメモリをリークしたとしても、それはまったく重要ではありません。
このオブジェクトは、プログラムの最後まで存続するようにスケジュールされており、メモリ リークが発生したとしても、メモリ リークの期間は、このグローバル オブジェクトがプログラムの最後のステートメントまで破壊されるまで続きます。その後、リークされたメモリは OS によって回収されます。プログラムが終了したら。

したがって、実際には、このオブジェクトがリークするかどうかは問題ではありません。もちろん、valgrind はそれをリークとして報告しますが、プログラムにとって重要でないときにリークします。

心配する必要があるリークの種類は、プログラムの存続期間中に繰り返しメモリをリークする繰り返しのリーク、関数、または構造です。これはせいぜい有限のリークシナリオであり、問​​題ではありません。

于 2012-12-06T07:12:02.067 に答える