如何制作存储在数组中的 STL 对象的副本?

y.s*_*hyk 1 c++

有一些关于 STL 对象和数组的东西我显然不明白。任何时候(2 次)我都尝试将一个存储在一个数组中,然后将其取回,但出现严重错误。单个对象的相同代码工作正常。

 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] << "";    
Run Code Online (Sandbox Code Playgroud)

另一个例子。让队列数组检索每个队列的副本:

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).
--------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

Sha*_*ger 8

你没有申报的数组std::stringstream,你声明数组的指针std::stringstream。并且既没有让它们指向任何有用的东西,也没有在您使用它们时取消引用它们。如果出现以下情况,您的代码应该可以正常工作:

std::stringstream* streams[4];
Run Code Online (Sandbox Code Playgroud)

改为:

std::stringstream streams[4];
Run Code Online (Sandbox Code Playgroud)

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