C++:在对象指针中为字符串赋值时的第一次机会异常

标签 c++ visual-c++ object visual-studio-2012

正如标题所暗示的,我试图将一个值插入到对象指针的字符串中。

在我的标题中,我的对象如下所示:

typedef struct d_tree
{
std::string name;
d_tree *parent;
std::vector<d_tree> dirs;
std::vector<t_file> files;
} tree_node;

(这是一项关于为好奇的文件和目录系统建模的作业。) 为了简单起见,我使用字符串和 vector (以避免 char * 和双指针数组的细微差别)

现在,对于这个目录树的头部,我的源代码中有:

tree_node *G = (tree_node *)malloc(sizeof(tree_node));
getline(dirs, dirp);  //First should be main parent, or ./
G->name = dirp;
G->parent = NULL;
tree_node *top = G;
tree_node *curr = G;

分配运行良好,getline 仅用于读取我将使用的一些字符串数据...但是一旦我点击 G->name = ...,我的编译器(使用 VS 12)大喊:

" First-chance exception at 0x57AD11CE (msvcr110d.dll) in File_System.exe: 0xC0000005:
 Access violation writing location 0xCDCDCDCD.

If there is a handler for this exception, the program may be safely continued. "

在抛出异常之前查看局部变量时,我注意到几件事:G 中的名称变量在值列中有一个。

parent 变量看起来也很奇怪,但我现在还不担心它(尤其是因为我正在将它设为 NULL,无论如何......)

非常感谢任何有关如何缓解此问题的建议(最好保留字符串,但如果不存在平滑的解决方案则可以理解)。

最佳答案

您正在使用 malloc 分配非 POD 类型的 structmalloc 只分配内存,它不会构造分配的struct 的非POD 成员。因此,当您尝试为该 struct 的非 POD 成员赋值时,您是在垃圾对象上调用每个成员类型的赋值运算符。

改用 new tree_node()。 (并且还使用 delete 而不是 free 来在你完成后释放内存。或者更好的是,假设你有一个没有循环的真树,使用智能指针指向为你释放内存。)

顺便说一句,你不需要做

typedef struct tag { ... } typename;

在 C++ 中;只是

struct typename { ... };

是等价的。

关于C++:在对象指针中为字符串赋值时的第一次机会异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16002991/

相关文章:

visual-c++ - 未捕获整数除以零异常

javascript - JS 对象默认单引号行为

javascript - Object 返回其构造函数而不是 JS 中的 false。为什么?

c++ - QML ListView 高度问题

c++ - C++ 中的增量流解析

c++ - 什么是独立函数?

c++ - 如何使用boost vertex_descriptors?

c++ - 无法为 ocx 注册输出错误

c++ - 将 LPVOID 转换为 CComVariant

javascript - 变量/对象是按值传递的吗?为什么我不能用 JavaScript 中的变量更改对象的属性?