0

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

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];
}

主.cpp:

#include "levenshteindb.h"

int main()
{
    LevenshteinDB *trie = new LevenshteinDB();
    trie->add_word();
    trie->add_word();
    trie->add_word();
    delete trie;
}

崩溃并且似乎有一个巨大的(与程序本身分配的内存相比)内存泄漏,但我真的不明白出了什么问题..我使用的是 qt 5.2

4

1 回答 1

3

您需要阅读有关三的规则

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

nodes.append(LevenshteinDBNode(size));

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

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


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

于 2014-01-08T09:53:03.087 回答