首页 > 解决方案 > 使用动态分配将 char* 复制到另一个 char**

问题描述

我还是这个主题的新手,但有人可以解释一下我如何将一个 char* 复制到另一个 char** 作为参数而不发生内存泄漏?

void Hardware::copyString(char** dest, const char* source)
{
  size_t length = strlen(source);
  auto string = new char[length+1];
  strncpy(string, source, length);
  string[length] = '\0';
  *dest = string;
  //need to be freed
  free(string); //if i free here the data would getting lost
}

和一个演员:

Hardware::Hardware(const char* name, int cost)
{
 copyString(&name_, name);
 cost_ = cost;
}

主文件

Hardware hard("CPU", 250)

我应该在哪里释放它而不会出现内存泄漏并获得正确的输出?

标签: c++memory-managementmemory-leaks

解决方案


无论您的实现中存在什么问题,您的问题的简单答案是在析构函数中释放它。

如果你不想暴露name_变量,你可以freeHardware类的析构函数中。

Hardware::~Hardware()
{
    delete[] name_;
}

如果您free在函数内部,即使您传递不同的变量,您也将删除堆分配,因为它们指向相同的内存位置。

但是,正如其他人所建议的那样,使用字符串的最佳方法是使用std::string.


推荐阅读