这是我的一本书中的一个问题(没有答案),我已经思考了几天了。答案是否简单: C++代码最终会崩溃,因为它会在每次迭代后创建一个垃圾内存单元?
考虑以下Java和C++代码片段,它们是基于图形用户界面的应用程序的两个版本的一部分,该应用程序收集用户首选项,并使用它们来汇编命令及其参数。方法/函数getUserCommandSpecification()返回一个表示命令代码及其参数的字符串。返回的字符串用于构建所需的命令,然后执行该命令。
假设如下所示:
(i)在命令对象(在Java中由cmd引用或在C++中由cmd指向)的while循环中创建之后,不再引用或使用对所生成的对象的引用/指针cmd。
(ii)应用程序还定义了类Command及其方法/函数execute()。
a.下面详细描述的两个代码版本中的哪一个最终会崩溃。
b.解释为什么一个程序版本崩溃,而另一个没有崩溃。
Java代码
...
while (true) {
String commandSpecification = getUserCommandSpecification();
Command cmd = new Command(commandSpecification);
cmd.execute();
}
...
C++代码
...
while (true) {
string commandSpecification = getUserCommandSpecification();
Command* cmd = new Command(commandSpecification);
cmd -> execute();
}
...
发布于 2012-11-12 12:24:32
是的,C++版本泄漏是由于new Command(...)
没有delete
造成的。当然,它可以很容易地以不同的方式编码,以避免这种情况:
...
while (true) {
string commandSpecification = getUserCommandSpecification();
Command cmd(commandSpecification);
cmd.execute();
}
...
...so我不确定这个例子是否像他们想的那样有启发性。
发布于 2012-11-12 12:24:29
C++代码创建了无数的Command
对象,这些对象永远不会被删除。在C++中,没有垃圾回收。必须在new
创建的所有实例上调用delete
。
发布于 2012-11-12 13:45:31
使用原始指针已经过时了。如前所述,这里是不必要的。在实际需要指针的情况下,使用std::unique_ptr。
while (true) {
string commandSpecification = getUserCommandSpecification();
std::unique_ptr<Command> cmd(new Command(commandSpecification));
cmd -> execute();
}
这里没有内存泄漏。
https://stackoverflow.com/questions/13338340
复制相似问题