Her*_*ero 3 c++ memory memory-leaks memory-management
在我的大学里,有一个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 char *src, char *dest) {
if (src==0 || dest==0) return;
int i=0;
for (; src[i]; ++i) dest[i]=src[i];
dest[i]=’\0’;
}
class Person {
char *name;
public:
Person(const char *str = "Susi") {
name = new char[strlen(str)+1];
strcpy(str,name);
}
Person(const Person &p) {
name = new char[strlen(p.name)+1];
strcpy(p.name,name);
}
~Person() {
//...
}
void change() {
name[4]='e';
}
ostream &print(ostream &o) const {
o<<name;
return o;
}
};
int main() {
Person maria("Maria"), peter("Peter"), franz("Franz"), luisa("Luisa");
Person mary(maria);
Person luise;
Person p(luise);
Person *friends= new Person[7];
friends[0]=maria;
friends[1]=peter;
friends[2]=franz;
friends[3]=luisa;
friends[4]=mary;
friends[5]=luise;
friends[6]=p;
friends[5]=luisa;
friends[3].change();
friends[4].change();
for (int i=0; i<7; ++i) {
friends[i].print(cout);
cout<<endl;
}
//???
return 0;
}
Run Code Online (Sandbox Code Playgroud)
你是绝对正确的.您可以通过仅在指定位置进行更改来修复它,但是它们会相当极端:
用以下内容替换//...析构函数内部:
delete[] name;
}
Person& operator=(const Person& other)
{
if (this != &other) {
delete[] name; // not completely exception-safe!
name = new char[strlen(other.name)+1];
strcpy(other.name,name);
}
return *this;
Run Code Online (Sandbox Code Playgroud)
另一个严重的问题是使用重新strcpy排序参数的新定义重新定义标准函数().
(另请参阅:SQL注入攻击,它还会导致现有的语法元素对,频繁的引号和括号与插入的语法元素重新配对)
| 归档时间: |
|
| 查看次数: |
289 次 |
| 最近记录: |