包含字符串值的结构在使用动态内存分配创建后导致其赋值时出现分段错误

问题描述 投票:0回答:4

编译器在以下代码上抛出运行时段错误:

#include <iostream>
#include <string>
using namespace std;

struct Node{
  int data;
  void *next;   
  string nodeType;
};

Node* initNode(int data){
  Node *n = (Node*)malloc(sizeof(Node));
  n->data = data;
  n->next = NULL;
  n->nodeType = "Node";   //if this line is commented it works else segfault
  return n;
}

int main() {
  Node *n1 = initNode(10);
  cout << n1->data << endl;
}

有人可以解释为什么字符串赋值在动态分配的结构中不起作用,而在静态分配的情况下为什么它起作用?

它的工作方式如下:

Node initNode(string data){
  Node n;
  n.data = data;  //This works for node creation statically
  n.next = NULL;
  n.nodeType = "Node";  //and even this works for node creation statically
  return n;
}

然后在主函数中:

int main() {
  Node n2 = initNode("Hello");
  cout << n2.data << endl;
}
c++ string memory-management struct dynamic-memory-allocation
4个回答
8
投票

这是行不通的,因为你实际上并没有将一个

Node
实例构建到你
malloc
.

的内存中

你应该使用

new
代替:

Node *n = new Node{};

malloc
只分配内存,它不知道类是什么或如何实例化一个类。你通常不应该在 C++ 中使用它。

new
分配内存 and 构造类的实例。


4
投票

没有执行 std::string 构造函数的地方。

你应该使用新的

example *e = new example;

或安置新

void *example_raw = malloc(sizeof(example));
example *e = new(example_raw) example;

3
投票
 Node *n = (Node*)malloc(sizeof(Node));

这个演员是胡说八道。你不能只是告诉编译器假装你刚刚分配的数据块包含一个有效的

Node
对象然后操纵它。


1
投票

string
在 C++ 中是一个类,创建字符串对象使用
new
而不是 malloc,如下所示。

Node *n = new Node{};
© www.soinside.com 2019 - 2024. All rights reserved.