【问题标题】:copy char* to another char** using dynamic allocation使用动态分配将 char* 复制到另一个 char**
【发布时间】:2018-10-10 11:30:01
【问题描述】:

我还是这个主题的新手,但谁能解释我如何将一个 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;
}

main.cpp

Hardware hard("CPU", 250)

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

【问题讨论】:

  • “我应该在哪里释放它而不发生内存泄漏并获得正确的输出?”不。使用std::string
  • 您的代码有很多问题。为什么不用std::string
  • 问题是,我不允许更改为什么我必须使用它的参数数据类型
  • 你真的需要复制任何东西吗?在您展示的示例中,没有必要这样做;只需在内部存储一个指向文字的指针。不要复制它,不要分配任何内存,不要释放它。
  • 由于这似乎是对课堂动态记忆的练习,请务必检查三/五/零规则(en.cppreference.com/w/cpp/language/rule_of_three)。

标签: c++ memory-management memory-leaks


【解决方案1】:

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

如果您不想暴露name_ 变量,您可以在Hardware 类的析构函数中free 它。

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

如果您 free 在函数本身内部,则您正在删除堆分配,即使您传递不同的变量,因为它们指向同一个内存位置。

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

【讨论】:

  • 感谢您的帮助!但我不能在 main 中使用 char* 测试。它受到限制,所以我必须用 ctor 初始化成员变量
  • 这样的话,在析构函数中就可以了,对吧?
  • @Joha:顺便说一句,你的问题不清楚,这就是为什么很多人(包括我)都弄错了。请在问题本身中提及您的意图和限制。
  • 啊,是的,这就是我要搜索的内容!谢谢!
  • 您不能在分配有new[] 的指针上调用free,这是未定义的行为。
猜你喜欢
  • 1970-01-01
  • 2020-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-03
  • 1970-01-01
  • 1970-01-01
  • 2013-08-20
相关资源
最近更新 更多