为什么<list>元素会在使用 malloc() 内存的对象中导致分割错误
Why would <list> element cause segmentation fault in an object using memory from malloc()
我有一个(简化的)C++类:
class node{
public:
int num;
list<int> iplist;
};
然后我为它动态分配内存:
node* node1 = (node*) malloc( sizeof(node) );
使用node1->num
可以,完全可以。但是,(node1->iplist).push_back(10)
将导致分段故障。我把它改回:
node* node1 = new node;
它再次工作良好,包括(node1->iplist).push_back(10)
。我在谷歌上搜索了答案,意识到这可能是因为malloc()
没有初始化元素。但是,在使用malloc()
时,我仍然对如何初始化<list>
元素感到困惑。
如果要使用malloc()
来分配对象,最可靠的方法是重载对象的new
运算符。
class node{
public:
int num;
std::list<int> iplist;
void * operator new (size_t sz) { return malloc(sz); }
void operator delete (void *p) { free(p); }
void * operator new[] (size_t sz) { return malloc(sz); }
void operator delete[] (void *p) { free(p); }
};
对于这些过载,使用new
或new[]
将导致对malloc()
的调用,以获取动态分配请求的内存。对delete
和delete[]
的调用将使用free()
来解除分配内存。
如果您想对c++对象使用malloc,你必须使用"放置新的":
void *p = malloc( sizeof(node) );
node* node1 = new (p) node;
node1->iplist.push_back(10);
相关文章:
- 迭代时从向量和内存中删除对象
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- 对具有动态分配的内存和析构函数的类对象的引用
- 当指向对象的指针作为参数传递给 std::thread 时,内存可见性
- 内存清理程序报告全局对象构造中未初始化值的使用
- 如何删除列出的"QGraphicsPathItem"对象以控制进程内存使用情况?
- 准确了解对象在内存中的映射方式
- 完全释放静态对象内存
- C++ 对象内存管理
- 循环中的自动变量和自动对象内存分配
- 每个对象内存分配有多少开销
- 是隐式创建的默认构造函数,负责分配对象内存
- 使用 make_unique 语句重新分配unique_ptr对象 - 内存泄漏
- C++对象内存布局
- C++对象内存消耗
- 谷歌模拟全局模拟对象内存泄漏
- 静态工厂方法和静态对象内存泄漏
- 关于对象内存布局的假设
- 如果我在管理C++对象内存的目标 C 中混合C++代码,ARC 会处理它