gpt4 book ai didi

c++ - 单例模式析构函数 C++

转载 作者:可可西里 更新时间:2023-11-01 18:09:01 26 4
gpt4 key购买 nike

我有这个单例模式,它运行正常。但是当我用 valgrind 执行我的程序来检查内存泄漏时,似乎该实例从未被销毁。

我的错误在哪里?

标题

class Stopwords {   
private:
static Stopwords* instance;
std::map<std::string,short> diccionario;

private:
Stopwords();

public:
~Stopwords();

public:
static Stopwords* getInstance();
std::map<std::string,short> getMap();
};

.cpp

Stopwords* Stopwords::instance = NULL;

Stopwords::Stopwords() {
diccionario = map<string,short>();

char nombre_archivo[] = "stopwords/stopwords.txt";
ifstream archivo;
archivo.open(nombre_archivo);
string stopword;
while(getline(archivo,stopword,',')) {
diccionario[stopword] = 1;
}
archivo.close();
}

Stopwords::~Stopwords() {
delete instance;
}


Stopwords* Stopwords::getInstance() {

if (instance == NULL) {
instance = new Stopwords ();
}
return instance;
}

map<string,short> Stopwords::getMap(){
return diccionario;
}

这不相关,但在初始化时,我从文件中读取了一堆单词,并将它们保存在 map 实例中。

谢谢

最佳答案

Stopwords::~Stopwords() {
delete instance;
}

这是类实例的析构函数。您可能希望在程序结束时调用此函数,就好像它是一种“静态”析构函数一样,但事实并非如此。

因此,您的 Stopwords 实例的析构函数会启动 Stopwords 实例的销毁;你在这里有一个无限循环,你永远不会进入。如果您真的进入这个循环,那么程序可能会崩溃。

有一种更简单的方法来处理单例:与其将实例保留为您手动分配的静态类成员,不如将其保留为静态函数变量。 C++ 将为您管理创建和销毁它。

class Stopwords {   
public:
static Stopwords &getInstance() {
static Stopwords instance;
return instance;
}

~Stopwords();
std::map<std::string,short> getMap();

private:
Stopwords();
std::map<std::string,short> diccionario;
};

另外,你应该将不需要修改类的成员函数标记为const:

std::map<std::string,short> getMap() const;

关于c++ - 单例模式析构函数 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20098254/

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