gpt4 book ai didi

c++ - 识别内存泄漏

转载 作者:搜寻专家 更新时间:2023-10-30 23:59:16 24 4
gpt4 key购买 nike

我正在尝试回答一些过去的试卷问题,这些问题是我在考试练习中遇到的,但对这两个问题不是很确定,非常感谢任何帮助。 (从图像中键入代码,认为它可以)。

问题 1:识别下面 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:为什么虚拟成员比没有虚拟成员的类的对象需要更多的内存?

A:因为每个虚拟成员都需要一个指针来存储在需要更多空间的 vtable 中。尽管这相当于增加了很少的空间。

最佳答案

Q1:请注意,v1 和 v2 是 int 指针,分别引用 10 和 20 的数组。删除运算符不匹配——即,既然是数组,就应该是

delete[] v1;
delete[] v2;

这样整个数组就被释放了。请记住始终匹配 new[] 和 delete[] 以及 new 和 delete

我相信您对第二季度的看法是正确的。必须跟踪的 vtable 和相应的指针确实会增加内存消耗。

关于c++ - 识别内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16927999/

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