使用对象创建shared_ptr数组

时间:2017-11-02 05:34:03

标签: arrays c++11 object 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];
}

错误:类型无效&#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;)|

我怎么能这样做?

1 个答案:

答案 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_ptrstd::unique_ptr这里有关于std::shared_ptr的构造函数的更多信息。

附注:

  1. 请提供minimal, complete, and verifiable example表示您的问题。
  2. 您确定需要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)) 则慢。