【发布时间】:2019-02-06 18:32:13
【问题描述】:
我想研究如何在指向 std::array 类元素的指针上使用旧式指针算法。以下代码(可能不出所料)无法编译:
int main(int argc, char *argv[])
{
double* data1 = new double[(int)std::pow(2,20)];
std::cout << *data1 << " " << *(data1 +1) << std::endl;
delete data1;
data1 = NULL;
double* data2 = new std::array<double, (int)std::pow(2,20)>;
std::cout << *data2 << " " << *(data2 +1) << std::endl;
delete data2;
data2 = NULL;
return 0;
}
作为练习,我想使用所有传统的指针算法,但不是指向旧式双精度数组,而是希望它指向 std::array 的元素。我对这一行的看法:
double* data2 = new std::array<double, (int)std::pow(2,20)>;
是告诉编译器data2是指向分配的堆的第一个元素std::array<double,(int)std::pow(2,20)>的指针。
我被告知double* name = new double[size]; 的意思是完全如下:«堆栈分配内存用于指向 ONE double 的指针并将指针命名为 name,然后堆分配一个大小为size的双精度数组,然后将指针设置为指向数组的第一个元素。»由于上面的代码无法编译,我一定是被教导了一些不正确的东西,因为相同的语法不适用于 std::arrays。
这引发了几个问题:
- 声明
type* name = new othertype[size];的实际含义是什么? - 如何使用 std::array 实现我想要的?
- 最后,如何使用 std::unqiue_ptr 和 std::make_unique 实现相同的效果?
【问题讨论】:
-
new std::array<double, 2>;Nonononono,不要这样做——事实上,尽可能避免new!还有你到底需要什么指针算术?std::array还为您提供通常优于原始指针的迭代器 -
请问-为什么你想做原始指针算术?
-
这应该是
std::array<double, 2> data2以避免混乱、不必要的new和奇怪的转换为double*。 -
(data1 +1)*?你是说*(data1 +1)(data1[1]) 吗?
标签: c++ arrays c++11 c++-standard-library