Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么<;列表>;元素使用malloc()中的内存在对象中导致分段错误 我有这个(简化的)C++类: class node{ public: int num; list<int> iplist; };_C++_Malloc_New Operator_Dynamic Memory Allocation - Fatal编程技术网

为什么<;列表>;元素使用malloc()中的内存在对象中导致分段错误 我有这个(简化的)C++类: class node{ public: int num; list<int> iplist; };

为什么<;列表>;元素使用malloc()中的内存在对象中导致分段错误 我有这个(简化的)C++类: class node{ public: int num; list<int> iplist; };,c++,malloc,new-operator,dynamic-memory-allocation,C++,Malloc,New Operator,Dynamic Memory Allocation,可以使用node1->num,完全可以。但是,(node1->iplist)。向后推(10)将导致分段故障。我把它改回: node* node1 = new node; 它再次正常工作,包括(node1->iplist)。向后推(10)。 我在谷歌上搜索了答案,意识到这可能是因为malloc()没有初始化元素。但是,在使用 MalCube()/C++ > < < /P> > P>时,我仍然困惑于如何初始化 元素。 您必须使用“placement new”: 如果要使用malloc()分配对象,

可以使用
node1->num
,完全可以。但是,
(node1->iplist)。向后推(10)
将导致分段故障。我把它改回:

node* node1 = new node;
它再次正常工作,包括
(node1->iplist)。向后推(10)

我在谷歌上搜索了答案,意识到这可能是因为
malloc()
没有初始化元素。但是,在使用<代码> MalCube()/C++ > < < /P> > P>时,我仍然困惑于如何初始化<代码> <代码>元素。 您必须使用“placement new”:


如果要使用
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); }
};
类节点{
公众:
int-num;
std::list-iplist;
void*运算符new(size_t sz){return malloc(sz);}
void操作符delete(void*p){free(p);}
void*运算符new[](size_t sz){return malloc(sz);}
void操作符delete[](void*p){free(p);}
};

使用这些重载,使用
new
new[]
将导致调用
malloc()
,以获取动态分配请求的内存。调用
delete
delete[]
将使用
free()
取消分配内存。

malloc
不运行构造函数。您的程序通过使用未初始化的内存块来显示未定义的行为,就像它是一个有效的、完全构造的
节点
实例一样。为什么你想在代码中使用<代码> MalCal?不要在C++代码中使用<代码> MalOC 。但是如果我使用Maloc,我仍然困惑了如何初始化一个元素。“你不应该这样做,这就是<>代码>新< /COD>的原因。现代C++甚至禁止使用<代码>新< /代码>,赞成<代码> MaMaIONION//COD>和<代码> MaMaJORYON/<代码>。如果必须将内存分配与初始化分开,则必须使用placement new手动调用构造函数:
node*node1=static_cast(malloc(sizeof(node));新的(静态_cast(node1))节点()(包括
)关于这个问题的许多重复:@ IGORANTTANNIK,因为我使用C++多于C++,所以我只想在C++中尝试,然后我就遇到这个问题。这个答案比使用布局<代码>新的<代码>更可靠,是放置<代码>新< /Cord>要求您在调用之前显式调用对象的析构函数。
free()
。这个答案还允许您的对象由智能指针正确管理,而无需您定义自定义删除器。
void *p = malloc( sizeof(node) );
node* node1 = new (p) node;
node1->iplist.push_back(10);
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); }
};