如何无限制地重新分配结构数组

How to realloc an array of structs without a limit

本文关键字:分配 结构 数组 新分配 无限制      更新时间:2023-10-16

所以基本上,我有一个动态分配的结构数组。

  using namespace std;
  struct library
  {
    string bookname;
    string author;
    int bookno;
  };
  int main()
  {
           library *lib=NULL;
           lib=malloc(sizeof(lib)*1);
           lib=(library*)realloc(lib,2);
           cout<<"Enter Book Name: "<<endl;
           getline(cin,lib[i]->bookname);
 }

在上面的程序中,我正在为库创建一个结构数组。我已经从 1 个空间重新分配到 2 个空间,可以增加到更多。但是我在获取每个数组成员的成员变量的输入时遇到问题。库[i] 在这里导致错误。

您的struct librarystd::string个成员,因此不是"POD"(普通旧数据(类。这意味着简单的 C 内存分配将不起作用,因为不会调用字符串构造函数和析构函数。

执行

要执行的操作的最简单方法是简单地使用 std::vector<library> .这将正确运行构造函数和析构函数,并自动调整自身大小。如果需要,可以使用 reserve()shrink_to_fit() 手动控制vector的分配大小。

如果你真的必须使用malloc()和朋友,那么你将需要使用放置new和手动析构函数调用。类似以下内容的方法可能有效:

library *lib = nullptr;
lib = static_cast<library*>(malloc(sizeof(library)*2)); // note not sizeof(lib)
lib = new (lib) library[2]{}; // default construct an array of library at the given location
cout<<"Enter Book Name: "<<endl;
getline(cin,lib[0].bookname);
// ...do other library stuff...
lib[0].~library(); // destroy librarys
lib[1].~library();
free(lib); // deallocate storage

但请注意,您仍然无法使用 realloc() .您必须创建一个新数组,使用放置 new 调用复制/移动构造函数,然后销毁并删除原始数组。

或者只是使用 std::vector ,它会为您完成所有这些工作。

仅从代码来看,有几处错误

  1. 您说您的问题来自: lib[i]好吧,提供的代码片段从未声明i
  2. lib是一个指针,当您将[]与指针一起使用时,您正在引用它,这意味着->将不起作用,而只需使用如下所示的.lib[i].bookname
  3. 特里斯坦·布林德尔是正确的,你需要使用new