有一个创建新内存的函数,并在构造函数中使用。 但是,我不知道如何在析构函数中访问它以删除它。
在构造函数中使用(相同文件)player.cpp
#include <string.h>
#include "Player.h"
// TODO: Fix the bugs in this file
Player::Player(const char* name) : name_(0)
{
copyString(&name_, name);
}
Player::Player(const Player& copy) : name_(0)
{
name_ = copy.name_;
}
Player::~Player()
{
delete [] name_; // Not sure if it works. errors promts- double free
}
Player& Player::operator=(const Player& copy)
{
return *this;
}
void Player::copyString(char** dest, const char* source)
{
unsigned int str_len = strlen(source);
char* str = new char[str_len+1]; //This line
strncpy(str, source, str_len);
str[str_len] = '\0';
*dest = str;
}
std::ostream& operator<<(std::ostream& out, const Player& player)
{
out << player.name_ << std::endl;
return out;
}
我被允许更改的是.cpp文件。 我添加了删除行我析构函数,但错误显示。
答案 0 :(得分:1)
复制构造函数需要进行深层复制,否则有两件事指向同一个地方......
Player::Player(const Player& copy) : name_(0)
{
copyString(&name_, copy.name_);
}
operator=
不起作用 - 只是忽略旧值,所以也应该复制....
Player& Player::operator=(const Player& copy)
{
if( this != & copy ){
delete [] name_;
copyString(&name_, copy.name_);
}
return *this;
}
析构函数中已经有delete []
。
规则3(或0)是关于如何管理资源的规则。如果实现析构函数,复制构造函数或operator =,那么您可能需要实现所有这三个。
如果你不这样做,你将没有任何一个(规则为0)。我们的想法是,如果一个资源需要在复制,构建或破坏时需要注意,那么就把它变成一个对所有三种行为都有充分考虑的个体类。
如果你创建基本类(比如这个“字符串”类 - 播放器),那么包含播放器的东西可以不知道副本的语义,并且知道为它们管理资源是安全的。