我有一個非常簡單的虛擬節目QVector內存管理
levenshteindb.h:
#ifndef LEVENSHTEINDB_H
#define LEVENSHTEINDB_H
#include <QVector>
#include "levenshteindbnode.h"
class LevenshteinDB
{
unsigned size;
QVector<LevenshteinDBNode> nodes;
void realloc_rows(unsigned node);
public:
LevenshteinDB();
~LevenshteinDB();
void add_word();
};
#endif // LEVENSHTEINDB_H
levenshteindb.cpp:
#include "levenshteindb.h"
#include <cstring>
#include <cstdio>
LevenshteinDB::LevenshteinDB()
{
size=15;
nodes.append(LevenshteinDBNode(size));
}
LevenshteinDB::~LevenshteinDB()
{
}
void LevenshteinDB::add_word()
{
nodes.append(LevenshteinDBNode(size));
}
void LevenshteinDB::realloc_rows(unsigned newsize)
{
for(unsigned i=0;i<nodes.size();i++)
nodes[i].realloc(newsize);
}
levenshteindbnode.h:
#ifndef LEVENSHTEINDBNODE_H
#define LEVENSHTEINDBNODE_H
struct LevenshteinDBNode
{
LevenshteinDBNode();
LevenshteinDBNode(unsigned size);
~LevenshteinDBNode();
unsigned *row;
void realloc(unsigned newsize);
};
#endif // LEVENSHTEINDBNODE_H
levenshteindbnode.cpp:
#include "levenshteindbnode.h"
LevenshteinDBNode::LevenshteinDBNode(){};
LevenshteinDBNode::LevenshteinDBNode(unsigned size)
{
row = new unsigned[size];
}
LevenshteinDBNode::~LevenshteinDBNode()
{
delete[] row;
}
void LevenshteinDBNode::realloc(unsigned newsize)
{
delete[] row;
row=new unsigned[newsize];
}
main.cpp中:
#include "levenshteindb.h"
int main()
{
LevenshteinDB *trie = new LevenshteinDB();
trie->add_word();
trie->add_word();
trie->add_word();
delete trie;
}
的崩潰,似乎有一個巨大的(相比於程序本身分配的內存)內存泄漏,但我真的不明白什麼是錯的.. 我使用QT 5.2
謝謝您的回答,這無疑擊中了問題(一個或多個),只有一個我想問其他的事情,我應該怎麼做才能解決這個問題?我的意思是,對於LevenshteinDBNode thatmakes對象的深層副本我可以定義一個拷貝構造函數,但以這種方式時,我稱之爲「nodes.append(LevenshteinDBNode(大小))」的內存分配兩次構造一個對象,這似乎對我來說不是很有效,所以我需要創建兩個方法init()和free()的手動分配和釋放「行」(並在構造函數中刪除和析構函數的任何「新」和「刪除」)? – woggio
@ user2318607不幸的是它是如何工作的。如果你有一個C++編譯器能夠11(和Qt被更新爲使用新的C++ 11個功能),你可以使用[移動語義(http://stackoverflow.com/a/3109981/440558)避免在某些情況下複製。但你仍然需要做一個拷貝構造了衆多的追隨者如何第二分配和數據的副本。 –
我認爲你可能OOK定義軸QVector LevenshteinDBNode ::行。 – nikitoz