如何处理在调整数组大小时失效的数组元素的指针?

时间:2014-11-06 08:30:32

标签: c++ arrays pointers

假设有这样的代码:

// Create a vector of size 0
std::vector<int> vec;

vec.push_back(1);
int* a = &vec[0];

vec.push_back(2);
int* b = &vec[1];

std::cout << "Element 0: " << &vec[0] << std::endl;
std::cout << "Element 1: " << &vec[1] << std::endl;
std::cout << "a: " << a << std::endl;
std::cout << "b: " << b << std::endl;

这段代码会打印出来:

Element 0: 0082AC58  // != 'a'
Element 1: 0082AC5C  // == 'b'
a: 0082AC18          // != 'Element 0'
b: 0082AC5C          // == 'Element 1'

当第二个push_back()被调用时,向量被调整大小并且指针a不再有效。所以,问题是:如何处理这种情况以避免指针失效?有可能以某种方式“重新验证”指针或使用某种“中间索引”吗?

1 个答案:

答案 0 :(得分:0)

这没有意义。依赖于指向矢量的指针肯定不是一个好的设计,因为当调整矢量大小时这些指针可能无效。

将指针用于向量只有在明确需要时才能理解,就像你想将向量传递给C API一样。在这种情况下,你还必须确保你已经采用足够大的向量的默认大小来排除任何重新分配的可能性。

下面是将向量传递给C API的有效示例。

// C API: this function takes a pointer to an array of at most arraySize
// doubles and writes data to it. It returns the number of doubles written,
// which is never more than maxNumDoubles.

size_t fillArray(double *pArray, size_t arraySize);

vector<double> vd(maxNumDoubles); // create a vector whose
                                  // size is maxNumDoubles
vd.resize(fillArray(&vd[0], vd.size())); // have fillArray write data
                                         // into vd, then resize vd
                                         //to the number of
                                         // elements fillArray