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

时间:2013-04-14 18:51:40

标签: 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;

(这是一个关于为好奇者建模文件和目录系统的任务。) 为了我的简单,我使用字符串和向量(以避免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中的name变量在value列中有一个。

父变量看起来也很奇怪,但我现在还不会担心(特别是因为我把它变为NULL,无论如何......)

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

2 个答案:

答案 0 :(得分:2)

您需要使用new来创建树节点,以便调用name的构造函数来初始化它。

//tree_node *G = (tree_node *)malloc(sizeof(tree_node));
  tree_node *G = new tree_node;

这应该有用 虽然如果你真的需要出于某种原因使用malloc分配内存,你可以使用placement new。

 void* gptr = malloc(sizeof(tree_node));//Allocate memory
 tree_node *G = new(gptr) tree_node;//construct object in allocated memory
 //Do whatever you want with G
 G->~tree_node();//Explicitly call destrutor
 free(gptr);//free memory

答案 1 :(得分:2)

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

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

顺便说一下,你不需要做

typedef struct tag { ... } typename;

在C ++中;刚

struct typename { ... };

等同。