向向下转换结构添加属性值会导致分段错误
Add property value to a down cast struct causes segmentation fault
我得到了这个代码:
#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
。由于Derived
比Base
需要更多的空间,因此使用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;
}
相关文章:
- 在某些循环内使用vector.push_back时出现分段错误
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 当我的阵列太大时出现分段错误
- 分段错误当我试图运行程序时出错
- 在c++中初始化矩阵时出现分段错误(核心转储)
- 尝试使用集合函数时出现分段错误
- 我无法缩小此分段错误的原因
- g++的分段错误(在NaN上使用to_string两次时)
- 我是如何在这段代码中出现分段错误的
- 创建结构的数组时遇到分段错误
- 在c++中键入向量中的所有值后,得到分段错误(核心转储)
- 在 c++ 中实现 Trie 时出现分段错误
- 为什么 fstream 在打开带有格式的文件时会导致分段错误?
- 为什么我遇到分段错误?
- 动态类的分段错误(家庭作业问题)
- 分段错误 - 读取初始化指针的数组
- 如何摆脱C ++中的分段错误错误?
- 使用 CTYPE 时出现分段错误
- 为什么代码给出分段错误?