メモリ管理を行うためのコードがありますが、「ライブ」リストからオブジェクトを削除して「デッド」リストに配置する特定の時点でクラッシュし続けます。
class MemoryObject {
private:
static std::list <MemoryObject *> alive, dead;
long references;
public:
MemoryObject() {
alive.push_back(this);
references = 0;
}
static void deepClean() {
clean();
std::list<MemoryObject *>::iterator iterator;
for(iterator = alive.begin(); iterator != alive.end(); iterator ++) {
MemoryObject *object = *iterator;
Log::instance().write(DEBUG_LOG, "\nObject still active at the end of the program, check for memory leaks."
"\nSize: %d",
alive.size());
delete object;
}
alive.clear();
}
void reference() {
references ++;
}
void release() {
references --;
if(references <= 0) {
dead.push_back(this);
alive.remove(this);
}
}
static void clean() {
std::list<MemoryObject *>::iterator iterator;
for(iterator = dead.begin(); iterator != dead.end(); iterator ++)
delete(&iterator);
dead.clear();
}
~MemoryObject() {
clean();
}
};
std::list <MemoryObject *> MemoryObject::alive, MemoryObject::dead;
Eclipse のデバッグでは、release() の下で、常に 2 番目のリスト関連のスポットで失敗していることが示されてalive.remove(this) and dead.push_back(this)
います。ただし、興味深いことに、printf() ステートメントなどの間に何かを配置すると、クラッシュしません...
ここから呼び出しています:
#include <stdlib.h>
#include <stdio.h>
#include "log/log.hpp"
#include "memory/object.hpp"
int main(int argc, char *argv[]) {
MemoryObject foo;
foo.release();
MemoryObject::deepClean();
return 0;
}
あなたdelete
経由で割り当てられたものだけnew
。
MemoryObject foo;
foo.release();
そして中はきれい
for(iterator = dead.begin(); iterator != dead.end(); iterator ++)
delete(*iterator); //I am assuming you have * instead of &(which is incorrect as mentioned in another answer).
つまりdelete()
、new
Try this で割り当てられていないものを呼び出しています。
MemoryObject *foo=new MemoryObject();
foo->release();
編集:これは、以下の理由でまだ機能しません。
内部では、現在のオブジェクトのclean()
要素を削除しています。つまり、次のようなことをしていますdead
this
class A
{
void delete_this()
{
delete(this);
//At this point "this" is a dangling pointer and you should not use it.
}
};
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加