C++ 如何复制存储在数组中的STL对象?

C++ 如何复制存储在数组中的STL对象?,c++,C++,关于STL对象和数组,我显然不太理解。任何时候,我都会尝试将一个存储在阵列中,然后将其取回,但出现严重错误。对于单个对象,相同的代码可以正常工作 void other(){ std::stringstream* streams[4]; for(int i = 0; i < 4; i ++){ streams[0] << ""; } } test2.cc:153:16: error: invalid operand

关于STL对象和数组,我显然不太理解。任何时候,我都会尝试将一个存储在阵列中,然后将其取回,但出现严重错误。对于单个对象,相同的代码可以正常工作

 void other(){
      std::stringstream* streams[4];
      for(int i = 0; i < 4; i ++){
        streams[0] << "";
      }
    }


test2.cc:153:16: error: invalid operands of types 'std::stringstream* {aka std::__cxx11::basic_stringstream<char>*}' and 'const char [1]' to binary 'operator<<'
     streams[0] << "";    
另一个例子。让队列数组检索每个队列的副本:

void debug(int num_workers, std::queue<int>* stuff){
      for(int i = 0; i < num_workers; i++){
        std::queue<int> q = stuff[i];
        printf("i:%d s:%d\n", i, stuff[i].size());
      }
    }
terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc
[2b7f97b93db8:07030] *** Process received signal ***
[2b7f97b93db8:07030] Signal: Aborted (6)
[2b7f97b93db8:07030] Signal code:  (-6)
[2b7f97b93db8:07030] [ 0] /lib/x86_64-linux-gnu/libpthread.so.0(+0x12890)[0x7fa2b1040890]
[2b7f97b93db8:07030] [ 1] /lib/x86_64-linux-gnu/libc.so.6(gsignal+0xc7)[0x7fa2b0c7be97]
[2b7f97b93db8:07030] [ 2] /lib/x86_64-linux-gnu/libc.so.6(abort+0x141)[0x7fa2b0c7d801]
[2b7f97b93db8:07030] [ 3] /usr/lib/x86_64-linux-gnu/libstdc++.so.6(+0x8c957)[0x7fa2b14f1957]
[2b7f97b93db8:07030] [ 4] /usr/lib/x86_64-linux-gnu/libstdc++.so.6(+0x92ab6)[0x7fa2b14f7ab6]
[2b7f97b93db8:07030] [ 5] /usr/lib/x86_64-linux-gnu/libstdc++.so.6(+0x92af1)[0x7fa2b14f7af1]
[2b7f97b93db8:07030] [ 6] /usr/lib/x86_64-linux-gnu/libstdc++.so.6(+0x92d24)[0x7fa2b14f7d24]
[2b7f97b93db8:07030] [ 7] /usr/lib/x86_64-linux-gnu/libstdc++.so.6(+0x9329c)[0x7fa2b14f829c]
[2b7f97b93db8:07030] [ 8] tst(+0x71fe)[0x5579e1a411fe]
[2b7f97b93db8:07030] [ 9] tst(+0x6986)[0x5579e1a40986]
[2b7f97b93db8:07030] [10] tst(+0x5b2e)[0x5579e1a3fb2e]
[2b7f97b93db8:07030] [11] tst(+0x4bf2)[0x5579e1a3ebf2]
[2b7f97b93db8:07030] [12] tst(+0x3f81)[0x5579e1a3df81]
[2b7f97b93db8:07030] [13] tst(+0x36f7)[0x5579e1a3d6f7]
[2b7f97b93db8:07030] [14] tst(+0x33b7)[0x5579e1a3d3b7]
[2b7f97b93db8:07030] [15] tst(+0x1fef)[0x5579e1a3bfef]
[2b7f97b93db8:07030] [16] tst(+0x2738)[0x5579e1a3c738]
[2b7f97b93db8:07030] [17] tst(+0x28a5)[0x5579e1a3c8a5]
[2b7f97b93db8:07030] [18] tst(+0x2fa9)[0x5579e1a3cfa9]
[2b7f97b93db8:07030] [19] tst(+0x482f)[0x5579e1a3e82f]
[2b7f97b93db8:07030] [20] tst(+0x3bbc)[0x5579e1a3dbbc]
[2b7f97b93db8:07030] [21] tst(+0x7f98)[0x5579e1a41f98]
[2b7f97b93db8:07030] [22] tst(+0x7f54)[0x5579e1a41f54]
[2b7f97b93db8:07030] [23] tst(+0x7f24)[0x5579e1a41f24]
[2b7f97b93db8:07030] [24] /usr/lib/x86_64-linux-gnu/libstdc++.so.6(+0xbd66f)[0x7fa2b152266f]
[2b7f97b93db8:07030] [25] /lib/x86_64-linux-gnu/libpthread.so.0(+0x76db)[0x7fa2b10356db]
[2b7f97b93db8:07030] [26] /lib/x86_64-linux-gnu/libc.so.6(clone+0x3f)[0x7fa2b0d5e88f]
[2b7f97b93db8:07030] *** End of error message ***
--------------------------------------------------------------------------
Primary job  terminated normally, but 1 process returned
a non-zero exit code. Per user-direction, the job has been aborted.
--------------------------------------------------------------------------
--------------------------------------------------------------------------
mpirun noticed that process rank 7 with PID 0 on node 2b7f97b93db8 exited on signal 6 (Aborted).
--------------------------------------------------------------------------

您没有声明std::stringstream的数组,而是声明了指向std::stringstream的指针数组。既没有让它们指向任何有用的东西,也没有在使用它们时取消对它们的引用。在以下情况下,您的代码应该可以正常工作:

std::stringstream* streams[4];
更改为:

std::stringstream streams[4];

在第二个示例中,抛出了std::bad_alloc,表示分配内存失败。假设您传递了有效的参数,这里的代码看起来很好,但很可能您有其他代码填充或损坏了堆,和/或您传递了一个垃圾指针,指向您在初始化数组和指针时不太小心的函数,它最终总是会咬到你,只有在请求另一个分配时才会被注意到,并且一切都会崩溃。

你没有声明一个std::stringstream数组,而是声明了一个指向std::stringstream的指针数组。既没有让它们指向任何有用的东西,也没有在使用它们时取消对它们的引用。在以下情况下,您的代码应该可以正常工作:

std::stringstream* streams[4];
更改为:

std::stringstream streams[4];

在第二个示例中,抛出了std::bad_alloc,表示分配内存失败。假设您传递了有效的参数,这里的代码看起来很好,但很可能您有其他代码填充或损坏了堆,和/或您传递了一个垃圾指针,指向您在初始化数组和指针时不太小心的函数,它最终总是会咬到你,只有当你要求另一次分配时,它才会被注意到,而所有事情都发生了。

@TedLyngmo我把它作为无关紧要的东西删除了。std::stringstream*streams[4]中的*in;使您创建4个指向std::stringstreams的未初始化指针,而不是ShadowRanger回答的4个std::stringstreams。@TedLyngmo我将其作为无关对象删除。std::stringstream*streams[4]中的*in;使您创建4个指向std::stringstreams的未初始化指针,而不是ShadowRanger回答的4个std::stringstreams指针。