你好,我正在尝试学习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'需要模板参数。
谢谢你的帮助。
3条答案
按热度按时间l7wslrjt1#
std::vector
和其他STL容器旨在消除使用指针和动态内存分配所带来的复杂性,例如内存泄漏、访问越界数据所调用的未定义行为等。std::vector
本身是动态的。emplace_back
或push_back
越多,它就增长得越多。如果你想要一个包含可变长度字符串的向量,为什么不这样声明它呢?同样,可以创建多维向量:
jogvjijk2#
std::vector
是一个模板类,但是您试图在没有为它的模板参数指定任何值的情况下使用它,这就是为什么会出现错误。然而,你不能像你现在尝试的那样,将
string*
指针赋值给vector*
指针。你的words
变量需要声明为string*
。至少这样代码才能编译。但是,代码在运行时不会正确运行,因为
malloc()
/realloc()
函数来自C运行库,而std::string
是一个需要构造的C++非平凡类,并且C函数不调用类构造函数。(并且忘记使用realloc()
,因为没有安全的方法来重新分配也是新放置的内存),例如:在这种情况下,使用
new[]
/delete[]
会更好/更安全:或者,正确使用
std::vector
,让它为您处理所有动态内存管理:zkure5ic3#
我们使用malloc为字符串向量分配内存,但malloc只分配原始内存,这意味着不能直接使用它创建向量数组,而是需要使用
new
关键字。您试图将malloc的返回值强制转换为一个vector*,但这是不允许的。相反,您可以使用vector类的
reserve
方法为数组中的向量分配必要的内存量,然后使用emplace_back
方法向数组添加新元素。希望这有帮助!