0

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

注意:作业的重点是编写您自己的自定义向量类,并且不允许我使用 C++ STL 提供的任何功能,例如数组。

编辑:如果我将其设为 int 或 char 向量,一切正常,但它需要完成所有 3 项。

编辑:很明显,我的讲师正试图以某种混乱的方式强迫我们这样做,这与良好的编码实践相去甚远。感谢你们的帮助,但我认为我不会在这里取得任何进展,因为你们都在告诉我要做正确的事,而且很明显我的讲师不想要正确的事情,他想要他认为正确的事情事物。

4

3 回答 3

3

使用newanddelete[]代替mallocand free。为什么?

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

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

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

    delete str;
    

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

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

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

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

于 2012-04-18T09:28:46.367 回答
2

When allocating memory for the elements you cannot use malloc for non-POD types - you need to call constructor for such type by using new. E.g. you cannot malloc memory for a std::string object and then use operator= to copy string (in whatever magical way) to returned address.

于 2012-04-18T09:30:11.603 回答
0

切勿new/deletemalloc/free/realloc. 而且,malloc/free/realloc在非 POD 类型(如std::string)上会产生未定义的行为。您的代码很危险,并且没有定义的运行时行为。

如果你的老板坚持使用它们,试着教他 C++ 的真正方法,或者接受你的应用程序有一天会崩溃(而且你将很难找到错误),或者辞掉工作,或者,如果你有大坚果,去找你的老板老板告诉他

此外,您有:

#include <stdlib.h>
#include <string.h>

如果您指的是std::string. 利用

#include <cstdlib>
#include <string>

更进一步:您在评论中声明不允许使用标准容器。但是您似乎使用std::string, 这是一个容器。

还有一件事:using namespace std;在标头中确实是不好的做法,迟早会导致难以调试的名称冲突。

让我再次重申: 在非 POD 类型上使用new/malloc/realloc意味着您的程序会丢失任何已定义的行为。它就像黑洞的地平线。

于 2012-04-18T10:02:26.523 回答