0

你好我有这个代码

class Triplets
{
public:
int nVal1;
int nVal2;
NodeT *ptrNode;
bool bUpdate;

Triplets()
{
    cout << "creating empty triplet" << endl;
    nVal2 = 0;
    nVal1 = 0;
    bUpdate = false;
    ptrNode = NULL;
}

~Triplets()
{
    cout << "destroying triplet" << endl;
    delete ptrNode;
}

Triplets(int nVal1, int nVal2, bool bUpdate, NodeT *ptrNode)
{
    cout << "creating triple with values" << endl;
    this->nVal2 = nVal2;
    this->nVal1 = nVal1;
    this->bUpdate = bUpdate;
    this->ptrNode = ptrNode;
}
 };

这种用法

void find_triplets(NodeT *ptrRoot)
{


   if (ptrRoot != NULL)
    {
    find_triplets(ptrRoot->left);
    find_triplets(ptrRoot->right);


    cout << "find triplets and save them to the queue" << endl;
        cout << " we hit a hot spot is null the root, nothing to see here move along boys" << endl;

     if(ptrRoot->left != NULL && ptrRoot->right != NULL)
        {

        if (ptrRoot->left->done == true && ptrRoot->right->done == true)
        {
        cout << "we got one of 2 sons true so do something, this are the sons "<< ptrRoot->left->key_value << " " << ptrRoot->right->key_value << endl;         

        cout << "sum them and put it in the father and set it to true " << endl;
        ptrRoot->key_value = ptrRoot->left->key_value + ptrRoot->right->key_value;
        ptrRoot->done = true;


        cout << "thread queue " << endl;
        Triplets triplet(ptrRoot->left->key_value, ptrRoot->right->key_value, ptrRoot->done, ptrRoot);
        qThreads.push(triplet);
       }
     }
     }
    }

而这个主要

MyThread mt;
mt.start();
mt.run();
cout << "sum = " << mt.sum(&bt) << endl;
THREADS_HOW_MANY = boost::thread::hardware_concurrency();
std::cout << THREADS_HOW_MANY << std::endl;

while (!bt.Values_to_do.empty())
{
    cout << "da vals to sum are these " << bt.Values_to_do.front() << " and aready done " << bt.values_done.front() << endl;
    bt.Values_to_do.pop();
    bt.values_done.pop();
}

  while(!mt.qThreads.empty())
{
cout << "da triplet are " << mt.qThreads.front().nVal1 << " " <<mt.qThreads.front().nVal2 << " "
        << mt.qThreads.front().ptrNode << " " << mt.qThreads.front().bUpdate
        << endl;
mt.qThreads.pop();

}

所有这一切都给了我这个结果(显然是错误的)

  done lets chek
  find triplets
  find triplets and save them to the queue
   we hit a hot spot is null the root, nothing to see here move along boys
   find triplets and save them to the queue
    we hit a hot spot is null the root, nothing to see here move along boys
 find triplets and save them to the queue
 we hit a hot spot is null the root, nothing to see here move along boys
 we got one of 2 sons true so do something, this are the sons 2 8
 sum them and put it in the father and set it to true 
 thread queue 
 creating triple with values
 destroying triplet
 find triplets and save them to the queue
 we hit a hot spot is null the root, nothing to see here move along boys
 find triplets and save them to the queue
 we hit a hot spot is null the root, nothing to see here move along boys
find triplets and save them to the queue
we hit a hot spot is null the root, nothing to see here move along boys
 we got one of 2 sons true so do something, this are the sons 11 15
 sum them and put it in the father and set it to true 
thread queue 
creating triple with values
destroying triplet
find triplets and save them to the queue
 we hit a hot spot is null the root, nothing to see here move along boys
 we got one of 2 sons true so do something, this are the sons 19976608 19976464
 sum them and put it in 
 the father and set it to true 
 thread queue 
 creating triple with values
 destroying triplet
 the gran total is 19976320

现在我的 q 是为什么我的三元组对象没有被添加到队列中而是被销毁,这就是导致总和全部搞砸的原因。谢谢。

4

2 回答 2

0

Tl; dr - 弹出的是你有一个管理内存的析构函数:

~Triplets()
{
    cout << "destroying triplet" << endl;
    delete ptrNode;
}

但没有复制构造函数和赋值运算符。尝试实施这些。

于 2012-06-19T07:05:32.167 回答
0

您似乎创建了Triplets该类的副本:

Triplets triplet(ptrRoot->left->key_value, ptrRoot->right->key_value, ptrRoot->done, ptrRoot);
qThreads.push(triplet);

根据 的声明qThreads,您首先创建一个Tripletsnamed的实例triplet,然后在将其推qThreads入时复制它。然后当范围离开时(在下一个}),triplet实例被销毁。这当然意味着您delete在其中的指针和副本所具有的指针现在将无效。

于 2012-06-19T07:15:15.843 回答