创建指向std::queue的指针并使用malloc为其分配内存时,我发现队列的默认大小不为零,如以下代码所示:

#include <queue>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char * argv[]) {

    std::queue <int> * received_queue = NULL;

    received_queue = (std::queue <int > *) malloc (sizeof (std::queue <int>));

    printf ("%d\n", received_queue -> size ());
}


返回的结果是:4294967168,我期望得到零。

我用vector替换了queue,所以代码变成了:

#include <vector>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char * argv[]) {

    std::vector <int> * received_vector = NULL;
    received_vector = (std::vector <int > *) malloc (sizeof (std::vector <int>));

    printf ("%d\n", received_vector -> size ());
}


现在返回的结果为0。

我的问题:分配std::queue时我错过了什么吗?

最佳答案

malloc分配一个内存块,但实际上不在那里构造对象,因此它将包含垃圾。这是您应该在C ++中改用new的原因之一。

如果将malloc调用替换为new std::queue<int>,则将看到预期的结果。

如果出于某种奇怪的原因,需要在内存块中构造一个对象,则可以使用“ placement new”:

new(received_vector) std::vector<int>;


并且还记得在调用free之前先调用析构函数(因为free也不会调用析构函数)。

关于c++ - 通过malloc创建std::queue的默认大小,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34052746/

10-16 04:46