对象变量值的C 连续检查产生不同的结果

C++ successive checks of object variable value yield different results?

本文关键字:结果 检查 变量值 连续 对象      更新时间:2023-10-16

我是C 的新手,尽管我之前曾与C和Java合作。

在以下代码中,i:

  • 定义多边形类。目前,它只有1个变量:numpoints
  • 创建一个全局指针,指向null的多边形对象
  • 为单击事件定义处理程序,如果对象存在,则只需打印NumPoints的值即可。如果没有,它将创建它并将数字的值设置为0。

    //defining polygon class
    class polygon{
    public:
        int numpoints;  
    };
    //create a global pointer that's uninitialized
    static polygon *current = NULL;
    //define a click handler.
    void leftClick(int x, int y){
        if (current==NULL){
            polygon newpoly;
            current = &newpoly;
            current->numpoints = 0;
            printf("created new polygonn");
            printf("%i pointsn", (*current).numpoints);
        }else{
            printf("polygon existsn");
            printf("%i pointsn", (*current).numpoints);
        }
    }
    

首单击后,程序打印

    created new polygon
    0 points

正如预期的。但是,在第二次单击之后,它打印出

    polygon exists
    -1567658064 points

或其他一些看似随机的数字。有人知道这里发生了什么吗?为什么值不在0?任何帮助都将不胜感激。

这应该有效:

//defining polygon class
class polygon{
public:
    int numpoints;  
};
//create a global pointer that's uninitialized
static polygon *current = NULL;
polygon newpoly;    
//define a click handler.
void leftClick(int x, int y){
    if (current==NULL){
        current = &newpoly;
        current->numpoints = 0;
        printf("created new polygonn");
        printf("%i pointsn", (*current).numpoints);
    }else{
        printf("polygon existsn");
        printf("%i pointsn", (*current).numpoints);
    }
}

问题是newpoly在第一个printf之后被销毁,因为它不超出范围。您必须学习在C 中如何管理内存。

newpoly是局部变量。您正在接受它的地址,但在此之后被销毁,因此地址不再引起感官。

您可以做的是使用动态分配:current = new polygon;


但是通常不以某种方式包装动态分配是不好的。

如果您使用的是C 11,则可以使用标题<memory>std::unique_ptr<polygon>

结果是

static std::unique_ptr<polygon> current; // No need to set it to NULL
...
current.reset(new polygon);

此更改将确保您的分配在需要时正确 delete d。