我是使用智能指针的新手,我试图创建相同但我有错误。
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];
}
错误:类型无效&#39; void [int]&#39;对于数组下标|
shared_ptr<data> sp( new data[30]);
for(int i=0;i<30;i++){
(sp+i)->setID(i);
}
错误:不匹配&#39;运营商+&#39; (操作数类型是&#39; std :: shared_ptr&#39;和&#39; int&#39;)|
我怎么能这样做?
答案 0 :(得分:0)
问题是您是否尝试将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
否则,您将获得未定义的行为,因为delete
将在new data[30]
返回的地址上调用delete[]
,而需要使用std::shared_ptr
。std::unique_ptr
这里有关于std::shared_ptr
的构造函数的更多信息。
附注:
std::shared_ptr
吗?不是std::unique_ptr
工作了吗? def RunInParallel(self, states):
res_q = multiprocessing.Manager().Queue()
processes = []
for s in states:
p = multiprocessing.Process(target=StateWorker,
args=(self, s, res_q))
processes.append(p)
p.start()
# Wait for all the processes to complete
for p in processes:
p.join()
results = [res_q.get() for _ in processes]
for result in results:
if result != 0:
return result
return 0
基本上和原始指针一样快,而def StateWorker(cmd_obj, state, result_queue):
result_queue.put(cmd_obj.RunState(state))
则慢。