博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++类static引发的问题
阅读量:5825 次
发布时间:2019-06-18

本文共 2155 字,大约阅读时间需要 7 分钟。

先看一段代码:
Java代码
#include <cstddef>   
#include <cstdio>   
#include <iostream>   
using namespace std;   
  
class TestSS;   
  
class TestStaticMember {   
public:   
    static TestSS* ssptr;   
};   
  
TestSS* TestStaticMember::ssptr = NULL;   
  
class TestSS{   
private:   
    int version;   
  
public:   
    TestSS(){   
        version = 1;   
        cout << "TestSS constructor..." << endl;   
    }   
  
    ~TestSS(){   
        cout << "TestSS deconstrcutor..." << endl;   
        //delete version;  
    }   
  
    void setVersion(const int ver){   
        version = ver;   
    }   
  
    int getVersion() const {   
        return version;   
    }   
};   
  
void init(){   
    TestSS ss;   
    TestStaticMember::ssptr = &ss;   
    ss.setVersion(111);   
  
    printf("In init: %p, %p\n", &ss, TestStaticMember::ssptr);   
    cout << "In init: " << TestStaticMember::ssptr->getVersion() << endl;   
}   
  
  
int main(int argc, char** argv){   
  
    init();   
  
    printf("In main: %p\n", TestStaticMember::ssptr);   
    cout << "In main: " << TestStaticMember::ssptr->getVersion() << endl;   
  
    return 0;   
}  
#include <cstddef>#include <cstdio>#include <iostream>using namespace std;class TestSS;class TestStaticMember {public:    static TestSS* ssptr;};TestSS* TestStaticMember::ssptr = NULL;class TestSS{private:    int version;public:    TestSS(){        version = 1;        cout << "TestSS constructor..." << endl;    }    ~TestSS(){        cout << "TestSS deconstrcutor..." << endl;        //delete version;    }    void setVersion(const int ver){        version = ver;    }    int getVersion() const {        return version;    }};void init(){    TestSS ss;    TestStaticMember::ssptr = &ss;    ss.setVersion(111);    printf("In init: %p, %p\n", &ss, TestStaticMember::ssptr);    cout << "In init: " << TestStaticMember::ssptr->getVersion() << endl;}int main(int argc, char** argv){    init();    printf("In main: %p\n", TestStaticMember::ssptr);    cout << "In main: " << TestStaticMember::ssptr->getVersion() << endl;    return 0;}
在我的环境,Linux 64位,编译器(g++ (GCC) 4.4.6 20120305 (Red Hat 4.4.6-4))
结果输出:
TestSS constructor...
In init: 0x7fff82029e50, 0x7fff82029e50
In init: 111
TestSS deconstrcutor...
In main: 0x7fff82029e50
In main: 111
因为我同事提供给我的一个API与这个类似,且告诉我这样调用,猛一看觉得有问题,于是写了上面的测试代码。但是输出结果出乎我的意料,一时间还以为我对于变量作用域理解有误或者是编译器对static成员做了特殊处理,于是上网搜各种资料,结果是 编译器不保证能正确访问被释放的内存了,即结果是不确定的,如果原来内存里面的值还没被擦除或覆盖就可能读出原来的值。于是疑惑解决了,真实蛋疼。

转载于:https://www.cnblogs.com/win7xt/archive/2013/06/07/3124367.html

你可能感兴趣的文章
Cocos2dx 3.0开发环境的搭建--Eclipse建立在Android工程
查看>>
基本概念复习
查看>>
重构第10天:提取方法(Extract Method)
查看>>
Android Fragment使用(四) Toolbar使用及Fragment中的Toolbar处理
查看>>
解决pycharm在ubuntu下搜狗输入法一直固定在左下角的问题
查看>>
多线程day01
查看>>
react-native 模仿原生 实现下拉刷新/上拉加载更多(RefreshListView)
查看>>
MySQL出现Access denied for user ‘root’@’localhost’ (using password:YES)
查看>>
通过Roslyn构建自己的C#脚本(更新版)(转)
查看>>
红黑树
查看>>
UIImagePickerController拍照与摄像
查看>>
python调用windows api
查看>>
第四章 mybatis批量insert
查看>>
Java并发框架——什么是AQS框架
查看>>
【数据库】
查看>>
Win配置Apache+mod_wsgi+django环境+域名
查看>>
linux清除文件内容
查看>>
WindowManager.LayoutParams 详解
查看>>
find的命令的使用和文件名的后缀
查看>>
Android的Aidl安装方法
查看>>