2016-01-20 69 views
-1

帮我理解这一点。 这里是上下文。当我在C++中执行buffer1.push_back(buffer2.front())时究竟发生了什么?

  • 我用C编写程序++。
  • 我有2个缓冲区(deque)。我们称它们为buffer1和buffer2;
  • 我有2个线程:一个线程被填充缓冲器1与随机值。另一个是将最早的buffer1值复制到buffer2;
  • 我正在使用互斥锁。

我想值复制缓冲器1到缓冲器2的1号位内,为了执行要做到这一点,我写了下面的代码行:

线程1

double a = 20.1; 
    buffer1.push_back(a); 

线程2

buffer2.push_back(buffer1.front()); 

我的问题是: 执行这一点,我是合通过参考找到价值或传递价值? 我解释我的问题。我在运行程序时遇到了随机内存问题。我想确定问题的根源在哪里。

谢谢大家。

+1

你的容器里面有什么?理想情况下,你会提供一个[MCVE]。 – 5gon12eder

+3

[''front'](http://en.cppreference.com/w/cpp/container/deque/front)和['push_back'](http://en.cppreference.com/w/)的文档cpp/container/deque/push_back)不清楚发生了什么? – NathanOliver

+3

你需要互斥体 – AndyG

回答

2

首先让我们来看看在你打电话的功能。 std::deque::push_back函数通过引用引用它的参数,所以不要在那里复制。并且std::deque::front返回一个reference(或const_reference),所以没有在那里复制。

现在让我们来看看底层的容器,默认为std::vector,这是同样的故事,其push_backfront用作std::deque

但是,如果你看一下std::vector::push_back参考近,你会看到,对于第一个重载的数据需要CopyInsertable,因为这是真的怎么载体内的元素由复制的对象,你“推初始化,返回“(如果你的编译器和数据类型支持,则返回移动)。

所以最后,如果你有一个复杂的课程,你应该遵循the rules of three, five or zero,如果它这样做,那么你应该没问题,并且不管怎么说都没有记忆问题。如果你按照三,五或零的规则做,但仍然有问题,那么问题可能在其他地方。尝试使用内存调试器,如Valgrind或类似的。如果你有一个多线程应用程序,你需要保护可以被多个线程同时修改的资源(例如使用互斥锁或信号量)。

0

根据this的std ::双端队列::前返回到第一元件的引用:

双端队列::前:

返回在双端队列容器到所述第一元素的引用。

而且根据this双端队列::的push_back拷贝(或移动)所述给定元素的含量:

双端队列::的push_back:

在的末尾添加一个新元素deque容器,在其当前最后一个元素 之后。 val的内容被复制(或移动)到新元素 。

0

我会说你的问题是在别的地方。由于您在不同线程中有片段,因此的顺序可能未被定义为。您可以结束了这个序列:

其中
double a = 20.1; 
buffer1.push_back(a); 
buffer2.push_back(buffer1.front()); 

情况一切正常的话,或与此序列:

buffer2.push_back(buffer1.front()); 
double a = 20.1; 
buffer1.push_back(a); 

在这种情况下,你的空容器调用buffer1.front()。复制构造函数被一些随机数据调用并产生内存问题。

相关问题