1

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

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

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,无论如何..)

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

4

2 回答 2

2

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

//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
于 2013-04-14T18:55:11.640 回答
2

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

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

顺便说一句,你不需要做

typedef struct tag { ... } typename;

在 C++ 中;只是

struct typename { ... };

是等价的。

于 2013-04-14T18:55:31.160 回答