使用对象创建 shared_ptr 的数组
Create a array of shared_ptr with objects
我刚开始使用智能指针,我正在尝试创建它,但我遇到了错误。
class data{
private:
int ID;
public:
void setID(int a){
ID=a;
}
int getID(){
return ID;
}};
int main(){
data d*;
d=new data[30];
for(int i=0;i<30;i++){
(p+i)->setID(i);
}}
我尝试:
shared_ptr<data> sp( new data[30]);
for(int i=0;i<30;i++){
sp->setID(i)[i];
}
错误:数组下标的无效类型 'void[int]'|
shared_ptr<data> sp( new data[30]);
for(int i=0;i<30;i++){
(sp+i)->setID(i);
}
错误:'operator+' 不匹配(操作数类型为 'std::shared_ptr' 和 'int')|
我该怎么做?
问题是您试图将 i
添加到 sp
,而不是添加到 sp
管理的指针。您要做的是先使用 get()
获取存储的指针:
for (int i = 0; i < 30; i++) {
sp.get()[i].setID(i);
}
如果您使用 C++17,还可以使用 operator[]
。
但是,您遇到了另一个问题(因此 operator[]
无法正常工作)。您正在将 new[]
的结果存储在 std::shared_ptr
中,它期望管理 new
返回的指针。您的 sp
构造实际上应该是:
std::shared_ptr<data[]> sp(new data[30]);
否则你会得到未定义的行为,因为 sp
将在 new data[30]
返回的地址上调用 delete
,而它需要使用 delete[]
。这是有关 std::shared_ptr
.
构造函数的更多信息
旁注:
- 请为您的问题提供minimal, complete, and verifiable example。
- 您确定需要
std::shared_ptr
吗? std::unique_ptr
不行吗? std::unique_ptr
基本上与原始指针一样快,而 std::shared_ptr
较慢。
我刚开始使用智能指针,我正在尝试创建它,但我遇到了错误。
class data{
private:
int ID;
public:
void setID(int a){
ID=a;
}
int getID(){
return ID;
}};
int main(){
data d*;
d=new data[30];
for(int i=0;i<30;i++){
(p+i)->setID(i);
}}
我尝试:
shared_ptr<data> sp( new data[30]);
for(int i=0;i<30;i++){
sp->setID(i)[i];
}
错误:数组下标的无效类型 'void[int]'|
shared_ptr<data> sp( new data[30]);
for(int i=0;i<30;i++){
(sp+i)->setID(i);
}
错误:'operator+' 不匹配(操作数类型为 'std::shared_ptr' 和 'int')|
我该怎么做?
问题是您试图将 i
添加到 sp
,而不是添加到 sp
管理的指针。您要做的是先使用 get()
获取存储的指针:
for (int i = 0; i < 30; i++) {
sp.get()[i].setID(i);
}
如果您使用 C++17,还可以使用 operator[]
。
但是,您遇到了另一个问题(因此 operator[]
无法正常工作)。您正在将 new[]
的结果存储在 std::shared_ptr
中,它期望管理 new
返回的指针。您的 sp
构造实际上应该是:
std::shared_ptr<data[]> sp(new data[30]);
否则你会得到未定义的行为,因为 sp
将在 new data[30]
返回的地址上调用 delete
,而它需要使用 delete[]
。这是有关 std::shared_ptr
.
旁注:
- 请为您的问题提供minimal, complete, and verifiable example。
- 您确定需要
std::shared_ptr
吗?std::unique_ptr
不行吗?std::unique_ptr
基本上与原始指针一样快,而std::shared_ptr
较慢。