为什么我的三重物体被摧毁?

时间:2012-06-19 07:02:31

标签: c++ oop queue

你好我有这个代码

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是为什么我的三元组对象没有被添加到队列中而是被销毁,这就是导致总和出来的所有混乱。感谢。

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

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

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

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