C++中的函数导致的内存泄漏

Memory leak caused by function in C++

本文关键字:内存 泄漏 函数 C++      更新时间:2023-10-16

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

在构造函数中使用(同一文件)播放器.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] = '';
  *dest = str;
}
std::ostream& operator<<(std::ostream& out, const Player& player)
{
  out << player.name_ << std::endl;
  return out;
}

我只能更改.cpp文件。我添加了删除行 i 析构函数,但出现了错误。

复制构造函数需要做一个深度复制,否则有 2 件事指向同一个地方......

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)规则是关于如何管理资源的规则。 如果实现析构函数、复制构造函数或运算符 =,则可能需要实现所有这三个。

如果你不这样做,那么你将没有一个(0规则)。 其思想是,如果一个资源在复制、构造或破坏时需要注意,那么把它变成一个单独的类,这三种行为都得到了很好的考虑。

如果您创建基本类(例如这个"字符串"类 - Player),那么包含 Player 的东西可以在不了解副本语义的情况下生存,并且知道为它们管理资源是安全的。