将“this”指针复制到缓冲区

时间:2017-09-12 13:52:50

标签: c++ pointers

我需要将this指针的地址复制到缓冲区并在其他位置重新进行类型转换。如果我在课外做,我知道我能做到。但是,在这里我特别需要使用这里提供的示例代码中给出的一些成员函数:

#include <iostream>
#include <cstring>

class MyClass
{
public:
    MyClass(const int & i)
    {
        id = i;
    }
    ~MyClass()
    {

    }
    void getAddress(char* address)
    {
        memcpy(address, this, sizeof(this));        
    }
    void print() const
    {
        std::cout<<" My id: "<<id<<std::endl;           
    }

private:
    int id; 
};

int main()
{
    MyClass myClass(100);
    std::cout<<"myClass: "<<&myClass<<std::endl; 
    myClass.print();

    // Need to copy the address to a buffer, sepcifically using a function as follows and retrieve it later
    char tmp[128];
    myClass.getAddress(tmp);

    // retreiving the pointer   
    MyClass* myClassPtr = (MyClass*) tmp;
    std::cout<<"myClassPtr: "<<myClassPtr<<std::endl;
    myClassPtr->print();

    return 0;
}

我的输出:

myClass: 0x7fff22d369e0
 My id: 100
myClassPtr: 0x7fff22d369f0
 My id: 100

我们可以看到两个地址不同。但是,这两个函数都正确打印id。我想知道这是怎么发生的!我还需要正确的方法。

2 个答案:

答案 0 :(得分:2)

正确版getAddress()

void getAddress(char* address)
{
    const MyClass* tmp = this;
    memcpy(address, &tmp, sizeof(this));
}

更新

// retreiving the pointer   
// MyClass* myClassPtr = (MyClass*) tmp; - wrong
MyClass* myClassPtr = *( (MyClass**) tmp );

答案 1 :(得分:1)

您没有复制this指针的值,而是指针指向的数据(memcpy需要复制数据的地址。)

正确的语法是:

MyClass*  ptr = this;
memcpy(address, &ptr, sizeof(ptr));

这就是为什么你在最后得到相同/正确的输出。

然后,作业

MyClass* myClassPtr = (MyClass*) tmp;

也是错误的,你将指针设置为与char缓冲区相同的地址,指向存储在char缓冲区中的地址。

可能的解决方案可能如下所示:

MyClass* myClassPtr;
memcpy( &myClassPtr, tmp, sizeof( MyClass*));

最后:我想知道你想要做什么,你想要实现这样的东西?也许这是解决这个问题的方法,但我强烈认为这是解决实际问题的错误方法......