尝试使用 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<Vertex>
。
【讨论】:
【参考方案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 数组