使用 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);
我正在尝试使用 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);