由C ++中的函数引起的内存泄漏

时间:2017-10-24 18:39:11

标签: c++ function memory-leaks constructor new-operator

有一个创建新内存的函数,并在构造函数中使用。 但是,我不知道如何在析构函数中访问它以删除它。

在构造函数中使用(相同文件)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文件。 我添加了删除行我析构函数,但错误显示。

1 个答案:

答案 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)。我们的想法是,如果一个资源需要在复制,构建或破坏时需要注意,那么就把它变成一个对所有三种行为都有充分考虑的个体类。

如果你创建基本类(比如这个“字符串”类 - 播放器),那么包含播放器的东西可以不知道副本的语义,并且知道为它们管理资源是安全的。