对象变量值的C 连续检查产生不同的结果
C++ successive checks of object variable value yield different results?
我是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。
相关文章:
- valgrind-hellgrind与泄漏检查的结果不同
- C++ 检查结果数组中有多少次数字
- 检查 n2 是否是 n1 的倍数后结果错误,但根本没有错误
- 如果结果为假,再次检查如何导致更多错误的结果?
- 检查并行化 BLAS 例程的结果
- 检查数字在C 中未返回正确结果的功能
- 检查乘法矩阵结果的方法?
- 对象变量值的C 连续检查产生不同的结果
- C++ 如何将 BYTE* 转换为 _CERT_TEMPLATE_EXT* 并在进一步使用前检查结果
- 检查文本文件中的 0 或 1,并根据结果返回
- 编译时检查大小是否为..(args) 匹配来自 constexpr 函数的结果
- 代码检查 std::unordered_set::find 的结果无法编译
- C++SFINAE运算符/函数结果类型检查
- 检查cin结果c++
- 检查流结果
- c++ mysql连接器检查结果集为空
- 为什么检查分配操作的结果有效,但不能与其他条件相结合
- 如何检查new[]使用free()的结果
- 如何检查boost::fusion:at_key的查询结果
- 检查结果时减少if语句