`
dwljd
  • 浏览: 5822 次
  • 性别: Icon_minigender_1
  • 来自: 福建
最近访客 更多访客>>
社区版块
存档分类
最新评论

C++类static引发的问题

阅读更多
先看一段代码:
#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成员做了特殊处理,于是上网搜各种资料,结果是 编译器不保证能正确访问被释放的内存了,即结果是不确定的,如果原来内存里面的值还没被擦除或覆盖就可能读出原来的值。于是疑惑解决了,真实蛋疼。


1
2
分享到:
评论
1 楼 zj831007 2013-05-30  
什么个意思。。。。

相关推荐

    C++MFC教程

    这个问题很多朋友都问过我,当然流汗是必须的,但同时如果按照某种思路进行有计划的学习就会起到更好的效果。万事开头难,为了帮助朋友们更快的掌握VC开发,下面我将自己的一点体会讲一下: 1、需要有好的C/C++基础...

    一组新的多维数组模板类

    在C/C++开发中,多维数组是一个让很多人感到棘手的问题.原因是C/C++中,多维数组被看 作是数组的数组. 在向函数传递参数的时候,多维数组经常让人感到是麻烦的制造者,通常都是传递首地址 和每一维的大小: ...

    2022年25道Java经典面试题(附答案)

    基础知识: 1.C++或Java中的异常处理机制...当一个类实现了接口以后,该类要实现接口里面所有的方法和属性,并且接口里面的属性在默认状态下面都是public static,所有方法默认情况下是public.一个类可以实现多个接口。

    大厂java面试题库集锦

    JAVA面试题集集锦(示例) ...当一个类实现了接口以后,该类要实现接口里面所有的方法和属性,并且接口里面的属性在默认状态下面都是public static,所有方法默认情况下是public.一个类可以实现多个接口。

    收藏的JAVA面试题大全

    当一个类实现了接口以后,该类要实现接口里面所有的方法和属性,并且接口里面的属性在默认状态下面都是public static,所有方法默认情况下是public.一个类可以实现多个接口。 3. 垃圾回收的优点和原理。并考虑2种...

    计算机Java、网络面试资料

    当一个类实现了接口以后,该类要实现接口里面所有的方法和属性,并且接口里面的属性在默认状态下面都是public static,所有方法默认情况下是public.一个类可以实现多个接口。 3. 垃圾回收的优点和原理。并考虑2种回收...

    JAVA面试题集合面试技能大全

    当一个类实现了接口以后,该类要实现接口里面所有的方法和属性,并且接口里面的属性在默认状态下面都是public static,所有方法默认情况下是public.一个类可以实现多个接口。 3. 垃圾回收的优点和原理。并考虑2种...

    java 面试题 总结

    Static Nested Class是被声明为静态(static)的内部类,它可以不依赖于外部类实例被实例化。而通常的内部类需要在外部类实例化后才能实例化。 22、JSP中动态INCLUDE与静态INCLUDE的区别? 动态INCLUDE用jsp:...

    在一小时内学会 C#(txt版本)

    除了内存分配的不同外,类和结构就和 C++ 中的情况一样。类的对象在堆中分配,并使用 new 关键字创建。而结构是在栈(stack)中进行分配。C# 中的结构属于轻量级快速数据类型。当需要大型数据类型时,你应该创建类。...

    超级有影响力霸气的Java面试题大全文档

    Static Nested Class是被声明为静态(static)的内部类,它可以不依赖于外部类实例被实例化。而通常的内部类需要在外部类实例化后才能实例化。 25、JSP中动态INCLUDE与静态INCLUDE的区别?  动态INCLUDE用jsp:...

    c#学习笔记.txt

    当在 catch 子句中再次引发当前异常对象时,它被省略。 (3)try –catch语句 try-catch 语句由一个 try 块和其后所跟的一个或多个 catch 子句(为不同的异常指定处理程序)构成。try-catch 语句采用下列形式之一: ...

    taetl:嵌入式模板库

    那时我还不知道像static_vector这样的项目已经存在。 我的实际目标已变成一个庞大的项目。 微控制器和其他嵌入式环境的标准库。 在技​​术上可行的范围内,API与STL相同。 所有算法均相同,配对和好友可用,还实现...

    易语言程序免安装版下载

     支持静态链接其它编程语言(如C/C++、汇编等)编译生成的静态库(.LIB或.OBJ),但仅限于COFF格式,支持cdecl和stdcall两种函数调用约定。  使用说明如下:函数声明和调用方法与DLL命令一致;“库文件名”以.lib...

    clang-plugins:自定义插件

    检查源词法化过程中是否发现了被禁止的标记(并引发错误)。这意味着即使被禁止使用的令牌最终并未真正被使用,也会引发错误。 禁止令牌更新插件 检查(并引起错误)被禁止使用的令牌。与ban-pp-tokens-plugin相比,...

Global site tag (gtag.js) - Google Analytics