如何用std :: vector替换Malloc

时间:2017-03-07 12:32:59

标签: c++

我的程序中存在一些内存问题,所以我试图将mallocs转换为vector但是没有成功。

我目前拥有的代码:

midimhandle_t dimensions[3], *dimensions_new;
dimensions_new = (midimhandle_t *) malloc(sizeof(midimhandle_t) * 3);
free(dimensions_new);

不起作用的矢量替换:

midimhandle_t dimensions[3], *dimensions_new;
std::vector<midimhandle_t> dimensions_new(sizeof(midimhandle_t) * 3)

但是,当我尝试使用替换代码运行我的代码时,我收到以下错误

error: cannot convert ‘std::vector<midimension*>’ to ‘midimension**’

所以我的问题是: 矢量的创建是错误的还是我还需要考虑其他因素?

3 个答案:

答案 0 :(得分:1)

我这样做:

std::array<midimhandle_t, 3> dimensions;
std::vector<midimhandle_t> dimensions_new(3);

第一个是固定大小的未初始化数组。它将其值直接存储在内部,因此如果它在堆栈上创建,则值也将是。

第二个是可调整大小的默认(值)初始化向量。它将其值存储在堆上。

答案 1 :(得分:0)

请替换此:

midimhandle_t dimensions[3], *dimensions_new;
std::vector<midimhandle_t> dimensions_new(sizeof(midimhandle_t) * 3);

简单地说:

midimhandle_t dimensions[3];
std::vector<midimhandle_t> dimensions_new(3);

答案 2 :(得分:0)

是的,你创建矢量的方法是错误的,你需要考虑其他因素。

假设您的原始C代码类似于

void some_function()
{
     midimhandle_t *dimensions_new;
     dimensions_new = (midimhandle_t *) malloc(sizeof(midimhandle_t) * 3);

      //  do something here

     free(dimensions_new);
 }

使用std::vector的粗略等价物将是

void some_function()
{
     std::vector<midimhandle_t> dimensions_new(3);    //  create vector with 3 elements

      //  do something here

      // the vector will cease to exist as the function returns
 }

要考虑的另一件事是std::vector实际上是一个C ++(模板化)类,因此支持一组不同的操作(例如访问元素),而不是指向使用{{1}分配的数组的指针} - 这意味着,根据malloc()表示的内容,您仍会遇到编译错误。您需要阅读// do something here的文档,以了解如何有效地使用它。