-1

帮助我理解这一点。这是上下文。

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

我想将 buffer1 的第一个位置内的值复制到 buffer2 中,为了执行此操作,我编写了以下代码行:

线程 1

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

线程 2

buffer2.push_back(buffer1.front());

我的问题是: 执行此操作,我是在复制值还是通过引用传递值? 我解释我的问题。我在运行程序时遇到随机内存问题。我想确定问题的根源是否在这里。

谢谢大家。

4

3 回答 3

2

首先,让我们看一下您正在调用的函数。该std::deque::push_back函数通过引用获取其参数,因此无需复制。并std::deque::front返回 a reference(or const_reference),因此也不会在那里复制。

现在让我们看一下默认为 的底层容器,std::vector它的push_backfront函数与 for相同std::deque

但是,如果您仔细查看std::vector::push_back参考,您会发现对于第一次重载,数据需要是CopyInsertable,因为这就是向量内元素的初始化方式,通过复制您“推回”的对象(或者如果您的编译器和数据类型支持它)。

所以最后,如果你有一个复杂的类,你应该遵循三、五或零的规则,如果这样做了,那么你应该没问题,无论如何都不会有记忆问题。如果您确实遵循了三、五或零的规则,但仍然有问题,那么问题可能出在其他地方。尝试使用内存调试器,例如Valgrind或类似的。如果您有一个多线程应用程序,您需要保护可以被多个线程同时修改的资源(例如使用互斥锁或信号量)。

于 2016-01-20T16:07:01.763 回答
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()一个空容器。复制构造函数被一些随机数据调用并产生内存问题。

于 2016-01-20T16:26:52.037 回答
0

根据这个std::deque::front 返回对第一个元素的引用:

双端队列::前面:

返回对双端队列容器中第一个元素的引用。

根据这个deque::push_back 复制(或移动)给定元素的内容:

双端队列::push_back:

在双端队列容器的最后一个元素之后添加一个新元素。val 的内容被复制(或移动)到新元素。

于 2016-01-20T16:19:05.237 回答