2013-05-06 61 views
0

我在我的C++项目中有一个讨厌的错误。还有一类如何在特定对象的特定方法中设置断点?

class SomeClass { 
    ... 
    std::string *someString; 
    ... 
} 

这里是一个构造函数

SomeClass(...) { 
    ... 
    someString = new std::string(""); 
    ... 
} 

而且事情是,事后我只与特定的字符串操作,而无需修改poiner值。我分配给该字符串不同的字符串的时候,像

*someString = "whatever"; 
someString->assign("whatever"); 
*someString += 'a'; 

多线程应用程序,有一个得了很严重的故障。在某个时候,应用程序崩溃。调试器显示变量some​​String具有A BAD POINTER。我不知道这是如何可能的

delete someString; 

从来没有呼吁。

我看了该字符串的指针所有引用和这里就是我可以告诉你:

  1. 删除该指针永远不会被调用。
  2. 指针永远不会被分配给其他任何东西(它可能在以后被删除)。
  3. 该字符串的指针值不会以任何方式改变(调试器显示'Bad Ptr')。
  4. 其他类变量看起来像他们应该是。

因此,我需要找到一种方法来检查何时在特定对象上调用析构函数。事实上,对象的数组。

那么,有没有一种方法来设置一个特定的对象集上的析构函数(或任何其他方法)的断点?(我正在处理visual studio 2010 proffessional)?

+0

你知道有条件的断点吗? – hansmaad 2013-05-06 11:05:02

+2

为什么你需要一个指向std :: string的指针......这有危险。 – fritzone 2013-05-06 11:10:27

+1

在赋值/复制构造函数上放置断点并查看这些操作的输出是否正确。 – shivakumar 2013-05-06 11:12:26

回答

1

如果您是多线程,请考虑为您的字符串成员实施锁定机制...(如果您没有这样做)。高度可能的一个线程试图写入一个正在重新分配在另一个线程中的指针......或类似的东西。多一点的代码可以帮助我们在更深的背景下理解问题。

+0

很好的答案,会试试看。没有想到,互斥可能会解决我的问题。 – 2013-05-06 11:18:05

+0

我试图锁定每个访问与互斥体的指针。另外,我试图检查指针值是否在创建后立即被修改。现在我确定调用了std :: string的某个地方的析构函数。尽管如此,我无法想象在哪里...... – 2013-05-06 16:56:38

相关问题