C++动态分配程序崩溃
C++ dynamic allocation program crashes
我有一段非常简单的代码,有 2 个结构和一个动态分配。程序在"nume"初始化时崩溃。
typedef struct{
int key;
string name;
} TElement;
typedef struct nod {
int cheie;
string nume;
struct nod *stg, *dr;
} NOD;
当我尝试这样做时
void ABC::inserare_element(TElement e){
NOD *p, *q;
int n;
/* construction nod p*/
n=sizeof (NOD);
p=(NOD*)malloc(n);
p->cheie = e.key;
p->nume = e.name; // on this line the program crashes
谢谢
malloc()
不会调用NOD
的构造函数,这意味着nume
的构造函数不会被调用,导致尝试在未构造/未初始化的std::string
上使用std::string::operator=
:use new
。
这里有
高级C++对象的热混合,例如std::string
和 C 样式的内存分配,例如 malloc
。问题是C++的new
运算符不仅分配内存,还调用高级对象的构造函数。您面临的问题是nume
类型为 std::string
的对象未正确初始化,因此您会遇到导致崩溃的未定义行为。那是因为你很幸运。如果程序实际上在工作,但会产生奇怪的、意想不到的结果,情况可能会更糟。
要使其按预期工作,您可以简单地使用 new
而不是 malloc
.例如:
p = new NOD;
如果您确实需要使用不关心C++对象的malloc
或其他内存管理 API,则必须使用 new 放置手动调用 nume
的构造函数。例如:
p = (NOD*)malloc(n);
new ((void *)&p->nume) std::string();
如果你这样做 - 不要忘记调用析构函数,否则你最终会出现内存泄漏。
你应该使用new而不是malloc。 malloc 是一个 C 函数,它只分配一大块内存。使用 new 将调用类的默认构造函数,此时也将调用字符串构造函数。
相关文章:
- 提升 ASIO Async_receive崩溃程序
- 类指针方法崩溃程序
- get_body来自 IHTMLDocument2 崩溃程序
- 是否有可能存在不会崩溃程序的内存问题
- 调试运行时出现奇怪的崩溃程序(Eclipse C++)
- 儿童对话框 - setWindowTexta或sendmessagea崩溃程序-MFC
- 顶点阵列GLFW崩溃C 程序
- 将值分配给Float数据类型崩溃程序
- OpenCV-将变量添加到类成员崩溃程序
- boost::interprocess::managed_shared_memory 崩溃程序
- 将枚举值分配给整数崩溃程序
- SDL 1.2 -> SDL 2.0(崩溃程序)
- 空析构函数崩溃程序:C++
- 冒泡排序崩溃程序c++
- Ofstream关闭崩溃程序
- 删除字符* 崩溃程序
- c++矢量擦除崩溃程序
- Lua_getglobal崩溃程序
- 通过Copy Constructor创建的e2打印崩溃程序
- RNG崩溃c++程序