我在c ++中定义了一个动态数组:
double *values;
int size = 5;
values = new (nothrow) double[size];
我知道这有效,因为它可以编译,但我看到了一些潜在的问题。
说我想为这个数组赋值:
double samples = [1,2,3,4,5,6];
values = samples; //runtime error: free or corruption
产生此错误究竟发生了什么?
答案 0 :(得分:1)
您应该使用std::copy
将静态数组复制到动态数组,如下例所示:
#include <iostream>
#include <algorithm>
int main() {
int *a = new int[5];
int b[] = {1, 2, 3, 4, 5};
std::copy(b, b + 5, a);
for(std::size_t i(0); i < 5; ++i) std::cout << a[i] << " ";
std::cout << std::endl;
return 0;
}
或者,如果您希望方便分配而不是按元素复制,并且只要您在编译时知道数组的大小并且编译器支持C ++ 11功能,请使用std::array
s作为示例下面:
#include <iostream>
#include <array>
int main() {
std::array<int, 5> a;
std::array<int, 5> b {{1, 2, 3, 4, 5}};
a = b;
for(auto i : a) std::cout << i << " ";
std::cout << std::endl;
return 0;
}
但是,建议您更喜欢使用原始动态数组std::vector
,如下例所示:
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> a(5);
int b[] = {1, 2, 3, 4, 5};
std::copy(b, b + 5, a.begin());
for(auto i : a) std::cout << i << " ";
std::cout << std::endl;
return 0;
}
答案 1 :(得分:1)
它不起作用,因为您正在为指针分配静态数组。
double *values;
double samples[] = {1,2,3,4,5,6};
就编译器而言,它们是两种不同的数据类型。
当你说:
values = new double[size];
您正在创建一个堆(动态)内存块,“values”保存数组中第一个元素的内存地址。要填充静态数组中的值,您需要单独分配每个元素,如下所示:
values[0] = samples[0];
values[1] = samples[1];
// or better yet
for (int i = 0; i < size; i++)
values[i] = samples[i]
答案 2 :(得分:-2)
您可以使用具有迭代器构造函数的std::vector
,这将为您解决问题。
std::vector<double> values(std::begin(samples), std::end(samples));
这将确保堆内存得到正确清理,即使在异常情况下也是如此,并使用实现的调试机制来帮助保护您免受缓冲区溢出等事件的影响。