由malloc创建std :: queue时的默认大小

时间:2015-12-02 20:52:45

标签: c++ vector queue

当创建指向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替换了队列,所以代码变成了:

#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时,我是否遗漏了一些内容?

2 个答案:

答案 0 :(得分:1)

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

如果您将malloc来电替换为new std::queue<int>,那么您会看到预期结果。

如果由于一些奇怪的原因,你需要在内存块中构建一个对象,你可以使用&#34; placement new&#34;:

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

并且还记得在调用free之前自己调用析构函数(因为free也没有调用析构函数)。

答案 1 :(得分:1)

这不是用C ++创建对象的方法。实际上,它是未定义的行为。

使用new运算符执行此操作,如下所示:

std::vector<int> * received_vector = new std::vector<int>;
std::queue<int> * received_queue = new std::queue<int>;

然后将正确构造(初始化)新创建的对象,因为new导致其构造函数被执行。