向向下转换结构添加属性值会导致分段错误

Add property value to a down cast struct causes segmentation fault

本文关键字:分段 错误 属性 转换 结构 添加      更新时间:2023-10-16

我得到了这个代码:

#include <iostream>
#include <string>
using namespace std;
struct Base {
  Base(string name) {
    this->name = name;
  }
  string name;
};
struct Derived: Base {
  string name2;
};
template <typename T>
T createNode(string name) {
  Base* node = new Base(name);
  return static_cast<T>(node);
}
int main() {
  Derived* node = createNode<Derived*>("hej");
  node->name2 = "bajs";
  cout << node->name2;
}

并且node->name2 = "bajs";线导致(随机)分割故障。我只是想知道如何纠正这一点,以免造成分割错误。我仍然想调用createNode()来创建基础节点,并在之后设置所有属性成员。它在c++中可行吗?

这段代码:

template <typename T>
T createNode(string name) {
  Base* node = new Base(name);
  return static_cast<T>(node);
}

创建类型为CCD_ 4的对象。

此:

  Derived* node = createNode<Derived*>("hej");
  node->name2 = "najs";    // No need to use rude words, even if you think most people can't read them.

使用创建的对象作为Derived。由于DerivedBase需要更多的空间,因此使用name2时,会覆盖在createNode中创建的对象之外的内容。name2也没有被构造,这意味着赋值很可能使用随机垃圾值,这本身很可能会导致崩溃。

您需要重新排列代码,使其首先创建正确的对象,如果您想使用构造函数,则需要为Derived提供一个接受命名对象的构造函数。[还有一些其他方法可以实现这一点,但通常不是您想要的]

也许,我不理解你的程序的想法,但我认为,它必须是这样的:

#include <iostream>
#include <string>
using namespace std;
struct Base {
  Base(string name) {
    this->name = name;
  }
  string name;
};
struct Derived: Base {
    Derived(string name):Base(name)
    {
    }
    // string name2; // it is not needed
};
template <typename T>
T* createNode(string name) {
  T* node = new T(name);
  return node;
}
int main() {
  Derived* node = createNode<Derived>("hej");
  node->name = "bajs";
  cout << node->name;
}