gpt4 book ai didi

c++ - QVector内存管理

转载 作者:行者123 更新时间:2023-11-28 00:35:51 27 4
gpt4 key购买 nike

我有这个非常简单的虚拟程序

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

最佳答案

您需要阅读有关 the rule of three 的内容.

发生的事情是当你这样做的时候

nodes.append(LevenshteinDBNode(size));

您创建一个临时 LevenshteinDBNode objectm,然后将其复制,导致两个对象具有指向同一内存的两个指针。然后销毁临时对象,这会导致调用析构函数,并删除您分配的内存。现在您有了该对象的拷贝,其中包含指向已删除内存的指针。

您需要实现一个复制构造函数,它对分配的内存执行所谓的深度复制。


您的代码中还有一个更微妙的错误,因为您没有在 LevenshteinDBNode 默认构造函数中初始化指针。这意味着如果你有一个默认构造的实例,指针将有一个不确定的值,实际上它会指向一个随机位置。如果在您尝试delete 这个随机指针时默认构造的实例随后被破坏,这将导致未定义的行为。您需要在默认构造函数中初始化指向 nullptr 的指针。

关于c++ - QVector内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20992096/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com