使用 Malloc 将内存分配给 STL 列表?

Using Malloc to allocate memory to STL list?

我正在尝试使用 malloc 为 stl 列表分配内存。我可以正常使用 new,如下所示:

typedef pair<int, int> iPair;
list< pair<int, int> > *adj;
adj = new list<iPair> [V];

但是如果我使用 malloc 而不是 new.

则会抛出分段错误
adj=(list<iPair> *)malloc(sizeof(list<iPair>)*V);

为什么malloc不能用于为STL容器分配内存?

因为 malloc 来自 C,而 C 不知道 类,因此没有构造函数的概念。 new 分配内存并调用适当的构造函数,malloc 只分配内存。

你可以这样做,但它的做法有点不同。基本上你需要确保你使用的内存被初始化。 malloc returns 内存未初始化。

您可以使用 placement new 在您选择的内存位置初始化列表对象。删除对象时要格外小心:

分配

void* memory = std::malloc(sizeof(list<iPair>) * V); // uninitialized memory

if (memory == nullptr)
{
    // allocating the memory may fail
    throw std::bad_alloc();
}
list<pair<int, int>> *adj = static_cast<list<pair<int, int>> *>(memory);

size_t initializedCount = 0;

// constructors may throw, so we need to make sure
// already initialized objects are freed in case this happend
try
{
    while(initializedCount < V)
    {
        adj = new (adj[initializedCount])list<pair<int, int>>();
        ++initializedCount;
    }
}
catch(...)
{
    // make sure destructors are called for objects initialized already
    for (size_t i = 0; i < initializedCount; ++i)
    {
        (adj +i)->~list<pair<int, int>>();
    }
    
    // free the memory we allocated ourselves & rethrow
    std::free(memory);
    throw;
}

删除

// release the memory
for (size_t i = 0; i < V; ++i)
{
    (adj + i)->~list<pair<int, int>>();
}

// free the memory we allocated ourselves & rethrow
std::free(memory);