cal*_*kon 17 c++ java pointers memory-management
这是我的一本书中的一个问题(没有附上答案),我已经考虑了几天了.答案很简单,C++代码最终会崩溃,因为它在每次迭代后都会创建一个垃圾内存单元?
考虑以下Java和C++代码片段,这是基于GUI的应用程序的两个版本的一部分,它收集用户首选项并使用它们来组装命令及其参数.方法/函数getUserCommandSpecification()返回表示命令代码及其参数的字符串.返回的字符串用于构建所需的命令,然后执行该命令.
假设如下:
(i)在Command对象的while循环中创建(在Java情况下由cmd引用或在C++情况下由cmd指向),不再引用或使用对生成的对象的引用/指针cmd.
(ii)应用程序还定义了一个类Command及其方法/函数execute().
一个.下面详述的两个代码版本中的哪一个最终会崩溃.
湾 解释为什么程序版本崩溃而另一个版本没有崩溃.
Java代码
...
while (true) {
String commandSpecification = getUserCommandSpecification();
Command cmd = new Command(commandSpecification);
cmd.execute();
}
...
Run Code Online (Sandbox Code Playgroud)
C++代码
...
while (true) {
string commandSpecification = getUserCommandSpecification();
Command* cmd = new Command(commandSpecification);
cmd -> execute();
}
...
Run Code Online (Sandbox Code Playgroud)
Ben*_*son 45
是的,由于new Command(...)没有,C++版本泄漏delete.当然,它可以很容易地编码,以避免这种情况:
...
while (true) {
string commandSpecification = getUserCommandSpecification();
Command cmd(commandSpecification);
cmd.execute();
}
...
Run Code Online (Sandbox Code Playgroud)
......所以我不确定这个例子是否像他们想象的那样具有指导性.
use*_*430 13
使用原始指针已经过时了.如前所述,这是不必要的.如果实际需要指针,请使用std :: unique_ptr.
while (true) {
string commandSpecification = getUserCommandSpecification();
std::unique_ptr<Command> cmd(new Command(commandSpecification));
cmd -> execute();
}
Run Code Online (Sandbox Code Playgroud)
这里没有内存泄漏.
由于内存泄漏,C++示例将崩溃.
Command* cmd = new Command(commandSpecification);
Run Code Online (Sandbox Code Playgroud)
在没有相应的情况下连续调用delete.
在C++中,没有垃圾收集(范围内的本地除外).因此,C++不断地Command在堆上分配对象,而不需要通过调用释放该内存delete.因此,C++程序最终会耗尽内存.
在Java中,垃圾收集器将看到堆上的对象不再被引用并释放它们,从而避免了内存不足错误.
| 归档时间: |
|
| 查看次数: |
1736 次 |
| 最近记录: |