c++ 使用Malloc创建动态向量数组

xmakbtuz  于 2022-12-15  发布在  其他
关注(0)|答案(3)|浏览(179)

你好,我正在尝试学习C++,我正在尝试使用malloc来创建一个向量数组,但我似乎不能让它工作。向量包含字符串。我没有问题,使数组与整数,但使用向量给我带来了一些问题。我有同样的问题与使用realloc。
我在努力,我做错了什么?

int buffer_size = 3;
int buffer_count= 0;
vector * words = (string *) malloc(buffer_size * sizeof(string));

//As array of vectors fills up I will add to the buffer count
if(buffer_count => buffer_size){
    words = (string*) realloc(words,buffer_size * sizeof(string));
}

就像我说的,我一定是malloc或realloc函数中的某个地方出了问题,我尝试的每一个地方都会出现各种错误,比如“使用类模板'vector'需要模板参数。
谢谢你的帮助。

l7wslrjt

l7wslrjt1#

std::vector和其他STL容器旨在消除使用指针和动态内存分配所带来的复杂性,例如内存泄漏、访问越界数据所调用的未定义行为等。
std::vector本身是动态的。emplace_backpush_back越多,它就增长得越多。如果你想要一个包含可变长度字符串的向量,为什么不这样声明它呢?

std::vector<String> words {"Hello", "World"};

同样,可以创建多维向量:

std::vector<std::vector<Type>> doubleContainer {};
jogvjijk

jogvjijk2#

std::vector是一个模板类,但是您试图在没有为它的模板参数指定任何值的情况下使用它,这就是为什么会出现错误。
然而,你不能像你现在尝试的那样,将string*指针赋值给vector*指针。你的words变量需要声明为string*。至少这样代码才能编译。
但是,代码在运行时不会正确运行,因为malloc()/realloc()函数来自C运行库,而std::string是一个需要构造的C++非平凡类,并且C函数不调用类构造函数。(并且忘记使用realloc(),因为没有安全的方法来重新分配也是新放置的内存),例如:

string *words = (string*) malloc(buffer_size * sizeof(string));
for (int i = 0; i < buffer_size; ++i) {
    new(&words[i]) string;
}
...
if (buffer_count >= buffer_size) {
    int new_buffer_size = buffer_size * 2;
    string *new_words = (string*) malloc(new_buffer_size * sizeof(string));
    for (int i = 0; i < buffer_size; ++i) {
        new(&new_words[i]) string(words[i]);
    }
    for (int i = buffer_size; i < new_buffer_size; ++i) {
        new(&new_words[i]) string();
    }
    for (int i = 0; i < buffer_size; ++i) {
        words[i].~string();
    }
    free(words);
    words = new_words;
    buffer_size = new_buffer_size;
}
...
for (int i = 0; i < buffer_size; ++i) {
    words[i].~string();
}
free(words);

在这种情况下,使用new[]/delete[]会更好/更安全:

string * words = new string[buffer_size];
...
if (buffer_count >= buffer_size) {
    int new_buffer_size = buffer_size * 2;
    string *new_words = new string[new_buffer_size];
    for (int i = 0; i < buffer_size; ++i) {
        new_words[i] = words[i];
    }
    delete[] words;
    words = new_words;
    buffer_size = new_buffer_size;
}
...
delete[] words;

或者,正确使用std::vector,让它为您处理所有动态内存管理:

vector<string> words;
zkure5ic

zkure5ic3#

我们使用malloc为字符串向量分配内存,但malloc只分配原始内存,这意味着不能直接使用它创建向量数组,而是需要使用new关键字。

vector<string> *words = new vector<string>[buffer_size];

您试图将malloc的返回值强制转换为一个vector*,但这是不允许的。相反,您可以使用vector类的reserve方法为数组中的向量分配必要的内存量,然后使用emplace_back方法向数组添加新元素。

if (buffer_count >= buffer_size) {
  words->reserve(buffer_size * 2);
  words->emplace_back();
}

希望这有帮助!

相关问题