我正在尝试回答一些过去的考试练习题,但对这两个问题不太确定,非常感谢任何帮助。(从图像上输入代码,认为没关系)。
Q1:找出下面 C++ 代码中的内存泄漏并解释如何修复它们。[9分]
#include <string>
class Logger {
public:
static Logger &get_instance () {
static Logger *instance = NULL;
if (!instance){
instance = new Logger();
}
return *instance;
}
void log (std::string const &str){
// ..log string
}
private:
Logger(){
}
Logger(Logger const&) {
}
Logger& operator= (Logger const &) {
}
~Logger() {
}
};
int main(int argcv, char *argv[]){
int *v1 = new int[10];
int *v2 = new int[20];
Logger::get_instance() . log ("Program Started");
// .. do something
delete v1;
delete v2;
return 0;
}
我的回答是,如果 main 由于提前返回或抛出异常而从未完成执行,则删除将永远不会运行,从而导致内存永远不会被释放。我一直在做一些阅读,我相信 auto_ptr 会解决问题?这会像换行一样简单吗?:
auto_ptr<int> v1 = new int[10];
auto_ptr<int> v2 = new int[20];
v1.release();
delete v1;
Q2:为什么虚拟成员比没有虚拟成员的类的对象需要更多的内存?
答:因为每个虚拟成员都需要一个指针来存储在需要更多空间的 vtable 中。虽然这相当于空间的增加很少。