将静态数组复制到动态数组

时间:2014-06-20 21:56:51

标签: c++ arrays

我在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

产生此错误究竟发生了什么?

3 个答案:

答案 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;
}

LIVE DEMO

或者,如果您希望方便分配而不是按元素复制,并且只要您在编译时知道数组的大小并且编译器支持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;
}

LIVE DEMO

但是,建议您更喜欢使用原始动态数组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;
}

LIVE DEMO

答案 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));

这将确保堆内存得到正确清理,即使在异常情况下也是如此,并使用实现的调试机制来帮助保护您免受缓冲区溢出等事件的影响。