我试图读取键盘中的字符串列表到我写的自定义矢量模板,但是由于某些未知的原因,当我尝试写入或读取时,程序在第二次或第三次输入后总是崩溃矢量对象。
注意:赋值的全部内容是编写自己的自定义向量类,不允许使用C ++ STL提供的任何功能,例如数组。
编辑:如果我将它设为int或char向量,一切都可以正常工作,但它需要完成所有3个。
编辑:很明显,我的讲师试图迫使我们以某种方式强制执行此操作,这种方式与良好的编码实践无关。感谢帮助人员,但我不认为我会去任何地方,因为你们都告诉我正确的事情,而且我的讲师明白我不想要正确的事,他想要他所决定的是是对的。
答案 0 :(得分:3)
使用new
和delete[]
代替malloc
和free
。为什么呢?
new
和delete
调用已创建对象的构造函数和析构函数,例如
string * str = new string("foo");
将在堆上创建string类型的对象,并返回指向它的指针,并且
delete str;
将调用其析构函数,然后释放内存。
malloc
和free
是C的内存管理功能,因此他们不知道
构造函数和析构函数。他们所做的就是从堆中获取并返回大块内存,
所以,如果你试图:
string * str = (string*) malloc(sizeof(string));
你将获得与字符串对象一样大的未初始化的内存块。 没有构造函数被称为。它可以(并且在大多数情况下会)导致错误,因为创建对象的正确操作很可能取决于正确的初始化(您的myvector
是一个很好的例子)。 free
的情况是对称的。
答案 1 :(得分:2)
为元素分配内存时,不能将malloc
用于非POD类型 - 您需要使用new
为此类型调用构造函数。例如。你不能为malloc
对象std::string
内存,然后使用operator=
将字符串(以任何神奇的方式)复制到返回的地址。
答案 2 :(得分:0)
切勿将new/delete
与malloc/free/realloc
混合。并且,非{POD类型(malloc/free/realloc
)上的std::string
会产生未定义的行为。您的代码很危险,没有定义的运行时行为。
如果你的老板坚持使用它们,试着教他关于C ++的真正方式,或接受你的应用程序将在某一天崩溃(你会有一个可怕的时间追查这些错误,或者辞掉工作,或者,如果你有大问题,请找老板老板告诉他
此外,你有:
#include <stdlib.h>
#include <string.h>
如果您引用std::string
,这不是标准C ++。使用
#include <cstdlib>
#include <string>
更进一步:您在评论中声明不允许使用标准容器。然而,您似乎使用std::string
,这是一个容器。
另一件事:标题中的using namespace std;
非常糟糕,迟早会导致难以调试的名称冲突。
我还要重申:
在非POD类型上使用new/malloc/realloc
意味着您的程序会丢失任何已定义的行为。它就像一个黑洞的地平线。