【问题标题】:Memory leak caused by function in C++C++中的函数导致的内存泄漏
【发布时间】:2018-04-05 16:18:01
【问题描述】:

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

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

【问题讨论】:

  • delete [] name_;?您必须发布更多代码,包括您的类定义以获得更明智的答案。
  • 如果name_指向那个内存,你不能delete[] name_;吗?考虑在实际项目中使用std::string,并使用智能指针代替原始的拥有指针。
  • 看起来你有(或需要)一个自定义析构函数。一些抬头阅读试图避免接下来的几个错误:What is The Rule of Three?
  • @RetiredNinja 我按照你的建议做了,但出现了错误。 '双重免费'
  • 您的赋值运算符和复制构造函数不正确,只是在复制指针。如果您想正确执行此操作,则需要制作数据的副本。 stackoverflow.com/questions/4172722/what-is-the-rule-of-threestackoverflow.com/questions/14063791/…

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


【解决方案1】:

拷贝构造函数需要做深拷贝,否则有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)规则是关于如何管理资源的规则。如果您实现了析构函数、复制构造函数或 operator=,那么您可能需要同时实现这三个。

如果你不这样做,你就可以不使用它们(0 规则)。其思路是,如果资源在复制、构造或破坏时需要注意,则将其制成一个单独的类,该类对所有三种行为都进行了充分考虑。

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

猜你喜欢
  • 1970-01-01
  • 2012-08-18
  • 1970-01-01
  • 1970-01-01
  • 2019-02-11
  • 2017-02-20
  • 2019-10-21
  • 2016-03-14
  • 1970-01-01
相关资源
最近更新 更多