我想知道如何访问结构中的向量,如下所述
#include<vector>
#include<iostream>
#include<stdlib.h>
using namespace std;
struct Hello{
vector<int>vec ;
};
struct Hello *h[1][1];
int main()
{
struct Hello *v = (struct Hello *)malloc(sizeof(struct Hello));
h[0][0]=v;
0][0]->vec.push_back(13);
//How to add 13 to vector vec?
//It shows an error. But why?
cout<<h[0][0]->vec.at(0)<<endl;
return 0;
}
答案 0 :(得分:3)
这是你的问题:
struct Hello *v = (struct Hello *)malloc(sizeof(struct Hello));
(另外,struct
每次在该行中使用时都是多余的。)
它为Hello
分配空间,但不构造它。
并且Hello
有一个非平凡的ctor,因为它的成员std::vector
有一个,因此省略对ctor的调用是错误的。
使用placement-new到就地构造Hello
,或者更好地分配和构造C ++方式:
Hello *v = new Hello;
// andd later deallocate
delete v;
最好,完全避免动态分配:
Hello h;
会员访问使用.
或指针->
。
答案 1 :(得分:1)
这不是你用C ++编写代码的方式。
首先,正如评论中正确提到的那样,不要使用malloc
。如果需要动态内存分配,请使用new
。否则你会有非构造的对象,就像你已经被告知过一样。
其次,如果不需要,请不要使用new
。如果您需要动态内存分配,很可能您希望使用智能指针来管理此内存,例如std::unique_ptr
。要构建unique_ptr<T>
,请使用std::make_unique<T>()
函数。使用 make_unique
将使您无需零件成本即可实现无泄漏和异常安全的程序。使用make_unique()
可以防止由于异常而导致泄漏的一些棘手情况,并在编写代码时节省几次击键。当然,零成本。请参阅GotW #89 Solution: Smart Pointers。
第三,你很可能甚至不需要动态内存分配。这不是Java,我们喜欢在堆栈上分配东西。请记住,std::vector
本身会动态内存分配来存储其缓冲区。由于移动语义,它可以在运行时有效地移动此存储。在动态内存中分配vector
本身没有多大意义。见Why should C++ programmers minimize use of 'new'?
搜索每个强调的项目以获取详细信息。