警告:之所以出现这个问题,是因为我必须处理一大堆糟糕的代码,没有适当的文档,这些代码是 6 年前由其他人作为研究项目编写的。显然,更好的解决方案是首先通过适当的设计不引起这些问题......
也就是说,问题是:摆脱这种情况的最佳方法是什么:
- 一个类在堆上分配内存,并在析构函数中释放它。
- 在某个地方,该类的一个实例在全局范围内声明。
- 存在一个初始化此实例的函数。
- 该函数的返回值用于初始化静态变量。
- 全局范围的变量在静态范围之外使用。
最小的工作示例:
文件“myclass.h”:
#ifndef MYCLASS_H
#define MYCLASS_H
#include<vector>
using namespace std;
class myclass{
vector<int> *onTheHeap;
public:
myclass(int len=0){
onTheHeap = new vector<int>(len);
}
~myclass(){
delete onTheHeap;
}
};
#endif
文件“static_loader.cpp”
#include "class.h"
myclass existsForever;
int cause_static_global_creation(){
existsForever = myclass(5);
}
static int bootstrap = cause_static_global_creation();
和文件“main.cpp”:
#include "class.h"
extern myclass existsForever;
int main(){
return 0;
}
构建:
g++ -g -c static_loader.cpp
g++ -g main.cpp static_loader.o
并运行为:
valgrind --leak-check=full ./a.out
结果:当在退出处理程序的以下 main 中调用其析构函数时,该变量被释放,而且在main 下的 static_initialization_and_destruction_0 函数中从 static_loader 调用!
有没有办法确保这些变量在不涉及广泛重构代码的情况下被完全释放?在我必须使用的库中,有几十个这种模式的实例......
编辑:
添加功能:
void operator=(myclass other){
delete this->onTheHeap;
this->onTheHeap = other.onTheHeap;
}
和
myclass(const myclass& other){
this->onTheHeap = new vector<int>(*(other.onTheHeap));
}
不改变行为。
第二次编辑:
myclass& operator=(const myclass& other){
delete this->onTheHeap;
this->onTheHeap = new vector<int>(*(other.onTheHeap));
return *this;
}
解决所有问题。无论如何,我的图书馆有这样的来源的内存泄漏,但我不再确定如何重现它。至少不是这样,也感谢重构等方面的建议!