**已关闭。**此问题为not reproducible or was caused by typos。当前不接受答案。
这个问题是由打字错误或无法再重现的问题引起的。虽然类似的问题在这里可能是on-topic,但这个问题的解决方式不太可能帮助未来的读者。
昨天关门了。
Improve this question
(Note我在LeetCode编译器上尝试这个,因为我很懒,不在单独的IDE上编写代码)。我有一个带有向量(指针,但我认为这在这里不重要)的结构。我使用malloc创建了一个指向该结构的指针,然后尝试执行struct->vector.push_back(...)
操作。以下是代码:
编辑:正如@joergbrech正确指出的那样,代码片段一点帮助都没有。
class Solution {
public:
struct Tnode {
int val, n ;
Tnode *parent;
vector<Tnode *> children;
};
vector<int> countSubTrees(int n, vector<vector<int>>& edges, string labels) {
unordered_map<int,Tnode*> mp;
for (auto edge: edges) {
if (!mp[edge[0]]) {
Tnode *temp = (Tnode *) malloc(sizeof(Tnode));
temp->val = edge[0];
mp[edge[0]] = temp;
}
if (mp[edge[1]]) {
mp[edge[0]]->children.push_back(mp[edge[1]]);
mp[edge[1]]->parent = mp[edge[0]];
}
if (!mp[edge[1]]) {
Tnode *temp1 = (Tnode *) malloc(sizeof(Tnode));
temp1->val = edge[1];
mp[edge[1]] = temp1;
temp1->parent = mp[edge[0]];
mp[edge[0]]->children.push_back(mp[edge[1]]);
}
}
Tnode *root = mp[0];
for (auto node: root->children)
cout << node->val << ' ';
return {};
}
};
编译器给出了错误内存读取的致命信号。确切的错误是:
AddressSanitizer:DEADLYSIGNAL
=================================================================
==31==ERROR: AddressSanitizer: SEGV on unknown address (pc 0x0000002a2ae4 bp 0x000000000000 sp 0x7ffc0bf42dc0 T0)
==31==The signal is caused by a READ memory access.
==31==Hint: this fault was caused by a dereference of a high value address (see register values below). Dissassemble the provided pc to learn which register was used.
#6 0x7fcb3d5af0b2 (/lib/x86_64-linux-gnu/libc.so.6+0x270b2)
AddressSanitizer can not provide additional info.
==31==ABORTING
我推测这是因为当我为结构体分配malloc时,它会为结构体的变量创建一个“刚性”内存布局,而执行“push_back”会扰乱这个布局,从而导致编译器禁止这个操作,对吗?
作为一个旁注,我如何创建一个具有动态大小的数据结构,可以存储不同数量的子节点?我想到了一个方法,我创建了一个指向Tnode指针数组的指针,但实现起来相当复杂,所以我想最好确认一下它是否有效。我在谷歌上也找不到任何特别适用的方法。
1条答案
按热度按时间aiazj4mn1#
我认为正在发生的事情
当你使用
malloc()
函数时,你分配了空间来存储struct Tnode
,但是你没有对Tnode
成员做任何初始化,特别是,你没有调用vector<Tnode *> child ;
的构造函数,如果你的结构只有基本类型,这就是问题的原因(int,float,char,pointers,等等)你不会有任何问题,但是对于像vector这样的复杂类型,你必须确保你调用了相应的构造函数。尝试更改行:
Tnode *temp1 = (Tnode *) malloc(sizeof(Tnode));
签署人:
Tnode *temp1 = new Tnode;