【问题标题】:Create a double pointer (ptr to ptr) to std::pair with boost使用 boost 创建指向 std::pair 的双指针(ptr 到 ptr)
【发布时间】:2013-03-19 23:05:38
【问题描述】:

我想重写以下代码以使用智能指针: 我正在努力寻找任何关于如何声明、分配内存和访问双指针的体面示例。谁能提供一个例子?我读过 shared_ptr 不是要走的路,因为它使用 delete 而不是 delete[],是否需要使用 shared_array?

#include <iostream>
#include <boost/shared_array.hpp>
#include <iomanip>

int main(int argc, char**argv) {
    std::pair<int,float> **corrArray;   
    int rows=10;
    int cols=5;

    corrArray = new std::pair<int,float>*[rows];
    for(int i=0; i<rows; i++) {
        corrArray[i] = new std::pair<int,float>[cols];
    }
    for(int i=0; i<rows; i++) {
        for(int j=0; j<cols; j++) {
            corrArray[i][j].first = i+j;
            std::cout << std::setw(3) << corrArray[i][j].first << " ";
        }
        std::cout << "\n";
    }
    for(int i=0; i<rows; i++) {
        delete[] corrArray[i];  
    }
    delete[] corrArray;
    return 0;
}

编辑:corrArray 必须首先声明(它将是一个类成员)

【问题讨论】:

  • “双指针”是指“指向指针”,而不是“指向double”的指针,是吗?
  • 是的,我的意思是指向指针的指针
  • 只需我的 2 美分:我会为你的二维结构对编写自己的类(包括适当的析构函数),或者使用 vector &lt; vector &lt; pair &lt;int,float&gt; &gt; &gt;
  • 超出范围时vector不会消失吗?
  • 是的,但是原始指针和智能指针也是如此(后者带着他们的指针,如果你没有对它们的其他引用,前者将他们的指针留在炼狱和地狱之间)。只要你需要,让你的对象保持生命是你的工作(尽管我个人发现这通常是自然发生的)。

标签: c++ boost double-pointer


【解决方案1】:

Boost shared_ptr 已经适用于数组:

http://www.boost.org/doc/libs/1_53_0/libs/smart_ptr/shared_ptr.htm

从 Boost 1.53 版开始,shared_ptr 可用于保存指向动态分配数组的指针。

shared_ptr<double[1024]> p1( new double(1024) );
shared_ptr<double[]> p2( new double(n) );

Boost shared_ptr 是 C++11 的一部分(因此您也可以使用它们):

smart pointers and arrays

std::unique_ptr<int[]> my_array(new int[5]);

更好的是,使用矢量,因为您根本不共享它:

std::vector<std::vector<std::pair<int,float>>> corrArray;

【讨论】:

  • 您错过了重点 - 我想将 shared_array 声明为私有类变量,然后稍后为其分配内存。不是一口气...
  • @user2089851 阅读shared_ptr的方法;您可以使用reset() 稍后更改它所指向的内容。使用 vector 会更好,因为您可以“分配” - push_back - 稍后。
猜你喜欢
  • 2013-07-19
  • 2020-04-28
  • 2021-04-06
  • 1970-01-01
  • 2011-07-09
相关资源
最近更新 更多