正如标题所示,我试图在对象指针的字符串中插入一个值。
在我的标题中,我的对象看起来如下:
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,无论如何......)
有关如何缓解此问题的任何建议(最好保留字符串,但如果不存在平滑解决方案,则可以理解)非常感谢。
答案 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}类型的struct
。 malloc
仅分配内存,它不构造分配的struct
的非POD成员。因此,当您尝试分配给struct
的非POD成员时,您将在垃圾对象上调用每个成员类型的赋值运算符。
请改用new tree_node()
。 (并且当你完成时还使用delete
而不是free
来释放内存。或者更好的是,假设你有一个没有循环的真树,使用智能指针为你释放内存。 )
顺便说一下,你不需要做
typedef struct tag { ... } typename;
在C ++中;刚
struct typename { ... };
等同。