【问题标题】:copying a string in C++ "Error reading characters of string."在 C++ 中复制字符串“读取字符串字符时出错。”
【发布时间】:2020-06-29 03:49:20
【问题描述】:

我正在实现一个堆栈,我想推送和弹出字符串数据。我可以不只是设置

字符串名称 = originalString ???

这是我要推送的内容:

void push(StackNode** top_ref, int nAttack, int nDefense, string nName, string nType) {
    StackNode* stackNode = (StackNode*)malloc(sizeof(StackNode));
    stackNode->attack = nAttack;
    stackNode->defense = nDefense;

    stackNode->name = nName; //not working
    stackNode->type = nType; //not working

    stackNode->next = NULL;
    stackNode->next = *top_ref;
    *top_ref = stackNode;
} 

其中stackNode->名称

并且 stackNode->type 已经定义为字符串

我不断收到:“读取字符串字符时出错。”

【问题讨论】:

  • 这是针对需要使用malloc 的学术课程吗?如果没有,我可以给你介绍new[]吗?等你习惯了,我可以给你介绍std::stack吗? en.cppreference.com/w/cpp/container/stack
  • 你能告诉StackNode类吗?
  • Yepp new 让它工作,虽然我不太清楚为什么它与 malloc 如此不同。谢谢您的帮助!我为未来的人替换了 malloc StackNode* stackNode = new StackNode;
  • malloc 是愚蠢的,只会给你这么多的内存。构造函数没有被调用。使用new,构造函数被调用。这就是区别。
  • 但要明确一点 - 这是针对需要您自己进行内存管理的学术练习?因为 C++ 最佳实践是在适当的时候使用 STL 容器。在这里,您将使用std::stack

标签: c++ string copy


【解决方案1】:

问题是malloc 不能很好地处理对象。见Does malloc create a new instance of the class or not?

malloc 分配了足够的空间来容纳StackNode,但不会调用它的构造函数。它也不会创建基础成员对象,包括您的strings。为此,您需要按照this 回答中所述进行操作:

A* a = (A*)malloc(sizeof(A));
new (a) A();

a->~A();
free(a);

但在这一点上,你真的应该只使用new。在 C++ 中使用new 的理由很少(有时间和地点,但尽量减少)。打电话给malloc的次数就更少了。

StackNode* stackNode = new StackNode;

它将适当地调用构造函数。完成后记得在内存上调用delete

【讨论】:

  • 感谢约翰,这绝对是“新的”,也需要感谢您的解释!
猜你喜欢
  • 1970-01-01
  • 2021-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-21
  • 1970-01-01
  • 1970-01-01
  • 2021-07-22
相关资源
最近更新 更多