- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个非常奇怪且可能很明显的问题,但我似乎找不到错误。我有一个类对象,它包含指向另一个类对象的指针,当调用第一个类对象的解构器时,它会尝试删除它的指针,但会导致段错误,而不会进入第二个类对象的解构器。
具体来说,我有一个 Optimizer 类的实例:
class Optimizer {
public:
Optimizer();
~Optimizer();
//Lot's of public methods and such
private:
PredictionRenderer *_predictionRenderer;
//Lot's of member variables
};
Optimizer::~Optimizer() {
std::cout<<"optimizer destructor:"<<_predictionRenderer->getWidth()<<std::endl;
delete _predictionRenderer; //THIS LINE CRASHES AND NEVER MAKES IT INTO THE PREDICTION RENDERER DECONSTRUCTOR
//other calls
}
(这是一个大项目,为了简洁起见,我删除了所有额外的方法/变量)。
Optimizer 有一个指向 PredictionRenderer 对象的指针,_predictionRenderer。该指针在调用构造函数期间初始化。该指针是私有(private)的,我检查并确保它无法“退出”(也就是说,此优化器对象之外的任何人都无法获得该指针。它永远不会被任何优化器的方法返回,也永远不会通过优化器方法传递给任何方法)。
尝试删除 Optimizer 对象时,我的程序在 delete _predictionRenderer 行出现段错误。执行永远不会进入 PredictionRenderer 解构器。我在delete调用之前的print语句中添加了验证指针不为NULL或者已经被删除,调用PredictionRenderer的getWidth方法成功返回,说明它一定是一个有效的指针(是否可以调用一个方法删除的对象?)。此外,print 语句只打印一次,所以我很确定 Optimizer 对象没有被复制和删除两次。最后,永远不会调用 PredictionRenderer 的解构函数,不会通过 delete 或其他任何方式调用。
我不知道是什么原因造成的。有没有人知道发生了什么事?
编辑:正如我在评论中提到的,这个代码库很大。我为没有展示太多而道歉,但我不能真正展示所有内容,因为没有足够的空间。这是我正在使用的其他人的代码,据我所知,他从未真正破坏这个对象,他只是让它在程序退出时被释放。我也可以这样做,但这似乎是一种黑客行为,而不是开展业务的好方法。
最佳答案
您确定要删除 _predictionRenderer
吗?你应该先检查一下。
if (_predictionRenderer)
delete _predictionRenderer;
如果你试图删除一个从未分配内存的指针,你的程序将会崩溃。
关于C++ 析构函数在删除调用时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28443670/
C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: ?
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
CStr 函数 返回表达式,该表达式已被转换为 String 子类型的 Variant。 CStr(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CSng 函数 返回表达式,该表达式已被转换为 Single 子类型的 Variant。 CSng(expression) expression 参数是任意有效的表达式。 说明 通常,可
CreateObject 函数 创建并返回对 Automation 对象的引用。 CreateObject(servername.typename [, location]) 参数 serv
Cos 函数 返回某个角的余弦值。 Cos(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Cos 函数取某个角并返回直角三角形两边的比值。此比值是
CLng 函数 返回表达式,此表达式已被转换为 Long 子类型的 Variant。 CLng(expression) expression 参数是任意有效的表达式。 说明 通常,您可以使
CInt 函数 返回表达式,此表达式已被转换为 Integer 子类型的 Variant。 CInt(expression) expression 参数是任意有效的表达式。 说明 通常,可
Chr 函数 返回与指定的 ANSI 字符代码相对应的字符。 Chr(charcode) charcode 参数是可以标识字符的数字。 说明 从 0 到 31 的数字表示标准的不可打印的
CDbl 函数 返回表达式,此表达式已被转换为 Double 子类型的 Variant。 CDbl(expression) expression 参数是任意有效的表达式。 说明 通常,您可
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant。 CDate(date) date 参数是任意有效的日期表达式。 说明 IsDate 函数用于判断 d
CCur 函数 返回表达式,此表达式已被转换为 Currency 子类型的 Variant。 CCur(expression) expression 参数是任意有效的表达式。 说明 通常,
CByte 函数 返回表达式,此表达式已被转换为 Byte 子类型的 Variant。 CByte(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CBool 函数 返回表达式,此表达式已转换为 Boolean 子类型的 Variant。 CBool(expression) expression 是任意有效的表达式。 说明 如果 ex
Atn 函数 返回数值的反正切值。 Atn(number) number 参数可以是任意有效的数值表达式。 说明 Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
Asc 函数 返回与字符串的第一个字母对应的 ANSI 字符代码。 Asc(string) string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
Array 函数 返回包含数组的 Variant。 Array(arglist) arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
Abs 函数 返回数字的绝对值。 Abs(number) number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
FormatPercent 函数 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 FormatPercent(expression[,NumDigitsAfterD
FormatNumber 函数 返回表达式,此表达式已被格式化为数值。 FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
我是一名优秀的程序员,十分优秀!