C ++在块内声明对象的持久性,内存泄漏的可能性?

时间:2013-07-16 16:50:05

标签: c++ class object block instantiation

首先让我在这个问题前加上以下几点: 1)我已经搜索了Stackexchange这个问题,大部分代码都很难让我遵循以保证提出一个新问题/打开一个关于此的新线程。我能找到的最接近的是Creating multiple class objects with the same name? c++,不幸的是,这超出了我的理解范围

2)http://www.cplusplus.com/doc/tutorial/classes/没有真正讨论这个问题,或者我错过了它。

现在已经不在了:

矩形类代码:

class Rectangle {
private:
    int lineNumber;
    float valueMax;
    float valueMin;
public:
    Rectangle(SCStudyInterfaceRef sc, int lineNumber, float valueMax, float valueMin);
    int getLineNumber(); // member function of class
    float getValueMax(); // member function of class Rectangle
    float getValueMin(); // member function of class Rectangle
};

Rectangle::Rectangle(SCStudyInterfaceRef sc, int lineNumber0, float value1, float value2) {
    lineNumber = lineNumber0;
    int value2_greater_than_value1 = sc.FormattedEvaluate(value2, sc.BaseGraphValueFormat, GREATER_OPERATOR, value1, sc.BaseGraphValueFormat); 
    if (value2_greater_than_value1 == 1) {
        valueMax = value2;
        valueMin = value1;
    } else {
        valueMax = value1;
        valueMin = value2;
    }
}

int Rectangle::getLineNumber() {
    return lineNumber;
}

float Rectangle::getValueMax() {
    return valueMax;
}

float Rectangle::getValueMin() {
    return valueMin;
}

这是更重要的部分,这个代码几乎在循环中运行,并且每当某个事件触发它时都会重复:

bool xxx = Conditions here

if (xxx) { 
// Draw new rectangle using plattforms code
code here

// Save rectangle information in the list:
Rectangle rect(sc, linenumbr + indexvalue, high, low);
(*p_LowRectanglesList).push_back(rect);
} 

bool yyy = conditions here

if (Short) { 
// Draw new rectangle using plattforms code
code here

// Save rectangle information in the list:
Rectangle rect(sc, linenumber + indexvalue, high, low);
(*p_HighRectanglesList).push_back(rect);

}

所以问题如下:

由于每次事件触发时都会循环,因此将运行代码的第二部分,将检查bool条件,如果真的将使用plattform集成代码绘制矩形。一旦绘制完成,该信息将使用:Rectangle rect(sc, linenumber + indexvalue, high, low);部分基于代码第一部分中的Rectangle类传递给新的矩形对象/实例,然后将该信息保存在列表中在代码的不同部分,现在和不相关。

当有新的Bool = True条件并且代码在执行完后执行后会发生什么?旧的矩形对象是否会被一个具有相同名称的新矩形对象替换并使用新参数(因为它们会因代码的编写方式而在每个实例上发生变化)?或者现在有两个Rectangle类的对象使用相同的名称“rect”?

从技术上讲,这对我来说甚至不重要,因为参数信息应该使用代码的(*p_HighRectanglesList).push_back(rect);部分推送到列表中

所以TL; DR: “rect”会被破坏/覆盖吗?或者现在有无限量的矩形对象/实例称为“rect”浮动?

我对文本墙感到抱歉,但作为一个完整的菜鸟,我认为最好勾勒出我的思维过程,这样你就可以更容易地纠正我的错误。

亲切的问候, 轨道

2 个答案:

答案 0 :(得分:1)

是的,rect被破坏并在每个循环中重新创建。在C ++中,块中声明的任何变量的范围(在本例中为if()语句)仅限于该块。每次你的程序迭代时,你都会得到一个新的rect,旧的rect就会消失。

答案 1 :(得分:0)

要添加,每当调用NEW时,基本上都是分配内存并创建Rectangle对象。 NEW将为每个实例分配地址。指针* rect将指向当前的内存地址,当你再次使用NEW调用rect时,现在rect将指向新的内存地址,前一个地址变为NULL引用。但是在C ++中,您不得不担心内存泄漏,这与您拥有垃圾收集器的Java不同。