如何无限制地重新分配结构数组
How to realloc an array of structs without a limit
所以基本上,我有一个动态分配的结构数组。
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 library
有std::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
,它会为您完成所有这些工作。
仅从代码来看,有几处错误
- 您说您的问题来自:
lib[i]
好吧,提供的代码片段从未声明i
-
lib
是一个指针,当您将[]
与指针一起使用时,您正在引用它,这意味着->
将不起作用,而只需使用如下所示的.
:lib[i].bookname
- 特里斯坦·布林德尔是正确的,你需要使用
new
相关文章:
- 如何在模板类函数中分配结构值?
- 在cuda中分配结构数组后,变量会丢失
- 在 GPU 上分配结构的 OpenCL 会导致垃圾
- 使用C++动态分配结构的多维数组
- 在读取大型 txt 文件时动态分配结构内的向量
- 在C++中更有效地分配结构体的内存
- 分段错误,在动态分配的结构内动态分配结构
- 如何无限制地重新分配结构数组
- 我在动态分配结构时遇到问题
- 为结构的整个向量分配结构的元素
- 在C++中分配结构
- 在c++中编写交换函数以重新分配结构数组中的成员值
- 如何分配结构,然后增加其大小
- 使用 malloc 在C++中动态分配结构
- 分配结构列表的向量
- 如何在方法中返回数组的动态分配结构
- 动态分配结构数组很麻烦
- 堆分配结构的初始值设定项列表
- 已分配结构包含向量的内存泄漏
- 从循环中分配结构成员