自定义矢量模板 - 字符串

时间:2012-04-18 09:21:37

标签: c++ string templates vector

我试图读取键盘中的字符串列表到我写的自定义矢量模板,但是由于某些未知的原因,当我尝试写入或读取时,程序在第二次或第三次输入后总是崩溃矢量对象。

注意:赋值的全部内容是编写自己的自定义向量类,不允许使用C ++ STL提供的任何功能,例如数组。

编辑:如果我将它设为int或char向量,一切都可以正常工作,但它需要完成所有3个。

编辑:很明显,我的讲师试图迫使我们以某种方式强制执行此操作,这种方式与良好的编码实践无关。感谢帮助人员,但我不认为我会去任何地方,因为你们都告诉我正确的事情,而且我的讲师明白我不想要正确的事,他想要他所决定的是是对的。

3 个答案:

答案 0 :(得分:3)

使用newdelete[]代替mallocfree。为什么呢?

  • newdelete调用已创建对象的构造函数和析构函数,例如

    string * str = new string("foo");
    

    将在堆上创建string类型的对象,并返回指向它的指针,并且

    delete str;
    

    将调用其析构函数,然后释放内存。

  • mallocfree是C的内存管理功能,因此他们不知道 构造函数和析构函数。他们所做的就是从堆中获取并返回大块内存, 所以,如果你试图:

    string * str = (string*) malloc(sizeof(string));
    

    你将获得与字符串对象一样大的未初始化的内存块。 没有构造函数被称为。它可以(并且在大多数情况下会)导致错误,因为创建对象的正确操作很可能取决于正确的初始化(您的myvector是一个很好的例子)。 free的情况是对称的。

答案 1 :(得分:2)

为元素分配内存时,不能将malloc用于非POD类型 - 您需要使用new为此类型调用构造函数。例如。你不能为malloc对象std::string内存,然后使用operator=将字符串(以任何神奇的方式)复制到返回的地址。

答案 2 :(得分:0)

切勿将new/deletemalloc/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意味着您的程序会丢失任何已定义的行为。它就像一个黑洞的地平线。

相关问题