【问题标题】:c++ visualizing memory of variablec ++可视化变量的内存
【发布时间】:2012-04-23 07:46:10
【问题描述】:

我想看看分配给两个不同变量的内存结构。
这背后的注意是要了解内存是如何按照存储不同数据类型的顺序来构造的。

在 C++ 中是如何实现的?

//how to show, whats in memory in &var1 &var2 ?
short var1 = 2;
string var2 = "bla";

【问题讨论】:

  • 内存的结构是什么意思?该地址存储的内容?一个字节一个字节?

标签: c++ eclipse variables memory


【解决方案1】:

如果您使用的是 Eclipse,则可以在调试透视图中使用 Memory View

要么这样,要么简单地创建一个指向变量的指针并检查这些变量的内容:

short var1 = 2;
string var2 = "bla";

char* pVar1 = (char*)&var1; //point to memory storing var1
char* pVar2 = (char*)&var2; //point to memory storing var2

【讨论】:

    【解决方案2】:

    如果您使用的是 MSVS,您可以打开 Memory 选项卡并输入您要检查的地址。

    您必须处于调试状态 - Debug -> Windows -> Memory

    【讨论】:

    • @Skip 你应该在问题中指定。
    • @Luchian Grigore 这个问题被标记为 eclipse。对我来说,这很明显。
    • @Matthias 我没有回答。
    • 当我创建这个线程时,我想到了 C++ 的内部可能性,比如 printf 变量的内存地址。我很高兴 IDE 提供了一种更随意的方式来解决问题。
    【解决方案3】:

    我通常使用类似以下的内容:

    template< typename T >
    class Dump
    {
    public:
        explicit            Dump( T const& obj ) ;
        void                print( std::ostream& dest ) const ;
    
        friend std::ostream& operator<<( std::ostream& dest, Dump const& source )
        {
            source.print( dest );
            return source;
        }
    
    private:
        unsigned char const*myObj ;
    } ;
    
    template< typename T >
    inline Dump< T >
    dump(
        T const&            obj )
    {
        return Dump< T >( obj ) ;
    }
    
    template< typename T >
    Dump< T >::Dump(
        T const&            obj )
        :   myObj( reinterpret_cast< unsigned char const* >( &obj ) )
    {
    }
    
    template< typename T >
    void
    Dump< T >::print(
        std::ostream&       dest ) const
    {
        IOSave              saver( dest ) ;
        dest.fill( '0' ) ;
        dest.setf( std::ios::hex, std::ios::basefield ) ;
        char const*         baseStr = "" ;
        if ( (dest.flags() & std::ios::showbase) != 0 ) {
            baseStr = "0x" ;
            dest.unsetf( std::ios::showbase ) ;
        }
        unsigned char const* const
                            end = myObj + sizeof( T ) ;
        for ( unsigned char const* p = myObj ; p != end ; ++ p ) {
            if ( p != myObj ) {
                dest << ' ' ;
            }
            dest << baseStr << std::setw( 2 ) << (unsigned int)( *p ) ;
        }
    }
    

    IOSave 是一个保存格式化状态的简单类 (flags, fillprecision) 在构造函数中,并在 析构函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-31
      • 1970-01-01
      • 2012-09-24
      • 2015-11-09
      • 1970-01-01
      相关资源
      最近更新 更多