基本上,我有一个动态分配的结构数组。
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个空格,可以增加到更多。但我在获取每个数组成员的成员变量的输入时遇到问题。 lib [i]在这里引起错误。
答案 0 :(得分:1)
您的struct library
有std::string
个成员,所以不是&#34; POD&#34; (普通数据)类。这意味着简单的C内存分配不起作用,因为不会调用字符串构造函数和析构函数。
做你想做的最简单的方法就是使用std::vector<library>
。这将正确运行构造函数和析构函数,并将自动调整大小。如果您愿意,可以使用vector
和reserve()
手动控制shrink_to_fit()
的分配大小。
如果你真的,真的必须使用malloc()
和朋友,那么你需要使用placement 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()
。您必须创建一个新数组,使用placement new调用复制/移动构造函数,然后销毁并删除原始数组。
或者只使用std::vector
,它会为您完成所有这些。
答案 1 :(得分:0)
仅仅看一下代码就有几个错误
lib[i]
嗯,提供的代码段永远不会声明i
lib
是一个指针,当您使用带有指针的[]
时,您引用它意味着->
将无效,只需使用.
,如下所示:{{ 1}} lib[i].bookname