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

问题描述 投票:0回答:1

关于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] << "";    

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

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).
--------------------------------------------------------------------------
c++
1个回答
5
投票

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

std::stringstream* streams[4];

已更改为:

std::stringstream streams[4];

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

© www.soinside.com 2019 - 2024. All rights reserved.