小编Her*_*ero的帖子

C++测试示例中可能存在的逻辑缺陷

在我的大学里,有一个C++实用的编程测试 - 我坚持一个例子,我不确定有关的任务是否有效并且可以正确完成.

(简单)任务:

  • 完成析构函数Person,以便name再次释放已分配的

  • 在main函数中,替换//???为释放先前分配的内存所需的语句

起初,这些任务对我来说似乎微不足道:对于析构函数,只需编写delete[] name并在main函数中使用即可delete[] friends.据推测,这也是这个例子的作者意味着我们要做的事情.

然而:

这个代码示例似乎存在缺陷,导致内存泄漏以及析构函数不止一次被调用.

person类没有赋值operator =,这意味着作为现有的Person对象,例如在main函数maria中分配给friends数组中的插槽,内部分配的names不会被复制.所以两个对象现在共享相同的内部char*指针!此外,指向Person先前驻留在所述阵列槽中的名称的指针永久地丢失,导致不可避免的存储器泄漏.

正如delete[] friends;所谓 - 数组中的对象被破坏 - 导致他们的析构函数被调用并释放其name成员.但是,当程序结束时,范围内的本地Person对象main被破坏 - 当然它们的name成员仍然指向之前已经释放的内存.

实际问题:

  • 这个测试示例是否有缺陷,或者我错过了什么?
  • 如果完全坚持执行给定的任务(改变析构函数的实现,并在主函数的注释部分插入新代码),是否可以解决上面列出的问题?

..

#include <iostream>
using namespace std;

int strlen(const char *str) {
    if (str==0) return 0;
    int i=0;
    for (; str[i]; ++i);
    return i;
}

void strcpy(const …
Run Code Online (Sandbox Code Playgroud)

c++ memory memory-leaks memory-management

3
推荐指数
1
解决办法
289
查看次数

标签 统计

c++ ×1

memory ×1

memory-leaks ×1

memory-management ×1