c++ 我可以在一个结构中有一个向量,我可以用指针访问它,并在它上面使用STL容量改变函数吗?[closed]

iswrvxsc  于 2023-01-15  发布在  其他
关注(0)|答案(1)|浏览(112)

**已关闭。**此问题为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指针数组的指针,但实现起来相当复杂,所以我想最好确认一下它是否有效。我在谷歌上也找不到任何特别适用的方法。

aiazj4mn

aiazj4mn1#

我认为正在发生的事情
当你使用malloc()函数时,你分配了空间来存储struct Tnode,但是你没有对Tnode成员做任何初始化,特别是,你没有调用vector<Tnode *> child ;的构造函数,如果你的结构只有基本类型,这就是问题的原因(int,float,char,pointers,等等)你不会有任何问题,但是对于像vector这样的复杂类型,你必须确保你调用了相应的构造函数。
尝试更改行:
Tnode *temp1 = (Tnode *) malloc(sizeof(Tnode));
签署人:
Tnode *temp1 = new Tnode;

相关问题