首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C++ vs Java:无限循环创建对象只会使C++崩溃

C++ vs Java:无限循环创建对象只会使C++崩溃
EN

Stack Overflow用户
提问于 2012-11-12 12:21:38
回答 8查看 1.8K关注 0票数 17

这是我的一本书中的一个问题(没有答案),我已经思考了几天了。答案是否简单: C++代码最终会崩溃,因为它会在每次迭代后创建一个垃圾内存单元?

考虑以下Java和C++代码片段,它们是基于图形用户界面的应用程序的两个版本的一部分,该应用程序收集用户首选项,并使用它们来汇编命令及其参数。方法/函数getUserCommandSpecification()返回一个表示命令代码及其参数的字符串。返回的字符串用于构建所需的命令,然后执行该命令。

假设如下所示:

(i)在命令对象(在Java中由cmd引用或在C++中由cmd指向)的while循环中创建之后,不再引用或使用对所生成的对象的引用/指针cmd。

(ii)应用程序还定义了类Command及其方法/函数execute()。

a.下面详细描述的两个代码版本中的哪一个最终会崩溃。

b.解释为什么一个程序版本崩溃,而另一个没有崩溃。

Java代码

代码语言:javascript
复制
...
while (true) {
   String commandSpecification = getUserCommandSpecification();
   Command cmd = new Command(commandSpecification);
   cmd.execute();
}
...

C++代码

代码语言:javascript
复制
...
while (true) {
   string commandSpecification = getUserCommandSpecification();
   Command* cmd = new Command(commandSpecification);
   cmd -> execute();
}
...
EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2012-11-12 12:24:32

是的,C++版本泄漏是由于new Command(...)没有delete造成的。当然,它可以很容易地以不同的方式编码,以避免这种情况:

代码语言:javascript
复制
...
while (true) {
   string commandSpecification = getUserCommandSpecification();
   Command cmd(commandSpecification);
   cmd.execute();
}
...

...so我不确定这个例子是否像他们想的那样有启发性。

票数 45
EN

Stack Overflow用户

发布于 2012-11-12 12:24:29

C++代码创建了无数的Command对象,这些对象永远不会被删除。在C++中,没有垃圾回收。必须在new创建的所有实例上调用delete

票数 18
EN

Stack Overflow用户

发布于 2012-11-12 13:45:31

使用原始指针已经过时了。如前所述,这里是不必要的。在实际需要指针的情况下,使用std::unique_ptr。

代码语言:javascript
复制
while (true) {
   string commandSpecification = getUserCommandSpecification();
   std::unique_ptr<Command> cmd(new Command(commandSpecification));
   cmd -> execute();
}

这里没有内存泄漏。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13338340

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档