尝试使用 malloc() 分配一个包含内部集合的结构来堆内存 [重复]

Posted

技术标签:

【中文标题】尝试使用 malloc() 分配一个包含内部集合的结构来堆内存 [重复]【英文标题】:Trying to allocate a struct which contains a set inside of it to heap memory using malloc() [duplicate] 【发布时间】:2021-01-22 02:48:15 【问题描述】:

我有一个如下所示的结构:

struct Vertex

    int state;
    int degree;
    int *neighbor;
    unordered_set<int> neighbors_set;
;

我正在分配一堆这样的结构:

vertex = (Vertex *)malloc(v_n * sizeof(Vertex));

但是当我尝试将项目添加到特定顶点的neighbour_set 时,如下所示:

vertex[x].neighbors_set.insert(1);

程序崩溃。

有人知道如何解决这个问题吗?

【问题讨论】:

Please see this discussion on why not to cast the return value of malloc() and family in C.. 请出示minimal reproducible example。 不要混合使用 C++ 和 C API。 @Yunnosch 我不同意。由于无序集,这是一个 c++ 问题。对于为什么 malloc 在 c++ 问题中不起作用的 99.9% 的真正答案是“不要使用 malloc”。这个答案不会出现在标记为 c 的问题中。 @RachidK。插入操作正在使用未构造的 C++ 对象 【参考方案1】:

您不能使用malloc() 在堆上分配 C++ 类并期望一切正常。它没有像new Vertex 那样调用unordered_set 的构造函数。

您可以将其更改为使用new Vertex 或至少使用放置新选项(类似于new(vertext) Vertex)来正确初始化对象。

P.S.:我错过了您正在分配多个对象。使用数组新选项或更好,避免所有手动内存管理并切换到std::vector&lt;Vertex&gt;

【讨论】:

【参考方案2】:

您清楚地知道std::unordered_set,因此解决此问题的最佳建议是正确使用c++ lib。在这种情况下,您似乎想要一个长度为v_n 的结构向量,因此,创建一个std::vector

std::vector<Vertex> vertices(v_n);

您的访问权限看起来是一样的,这次应该可以了。

【讨论】:

以上是关于尝试使用 malloc() 分配一个包含内部集合的结构来堆内存 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如果 Malloc 无法分配 X 字节,我是使用 Realloc 还是再次使用 Malloc? C++

GDB 调试器 - 未定义“malloc”。尝试使用调试器分配 C 数组

重用 malloc() 分配的内存空间

为什么我不能在这个线程完成执行后访问线程内部分配的数组?

memcached 的内存分配器是如何工作的?为什么不适用 malloc/free!?为何要使用 slabs?

memcached 的内存分配器是如何工作的?为什么不适用 malloc/free!?为何要使用 slabs?