在c ++中实例化指向新对象的指针时出现的问题

时间:2012-07-02 13:35:45

标签: c++ pointers null instantiation

我是c ++的新手。我已经尝试了一切,但无法解决我的问题。仅仅是为了一些背景:我正在使用Botan库进行加密。我不认为这个问题与库有什么关系,更多的是指针和对象。

当我使用以下代码时,没有问题。每行后面的注释解释了会发生什么。 (该代码仅供参考)

int main(int argc, char** argv)
{
    DH_PrivateKey *Apriv = 0; // Apriv points to 0x00
    MemoryVector<unsigned char> *Apub = 0; // Irrelevant for now
    AutoSeeded_RNG rng; // Irrelevant object
    DL_Group domain("modp/ietf/3072"); // Irrelevant object
    Apriv = new DH_PrivateKey(rng,domain); // Apriv points to 0x8079098

这里的主要观察是实例化对象,Apriv指向该对象。这就是我想要发生的事情。当我尝试在另一个将Apriv指针传递给的函数中执行此操作时会出现此问题。

我的主要代码更改为以下内容:

int main(int argc, char** argv)
{   
    DH_PrivateKey *Apriv = 0;
    MemoryVector<unsigned char> *Apub = 0;
    AutoSeeded_RNG rng;
    DL_Group domain("modp/ietf/3072");
    encryption::dh_generatekeys("modp/ietf/3072",Apriv,Apub); //Passing pointers

我传递这些指针的函数看起来像这样:

void encryptionalgorithm::dh_generatekeys(string shareddomain,DH_PrivateKey *privatekey,MemoryVector<unsigned char> *publickey)
{
    AutoSeeded_RNG rng; // Irrelevant
    DL_Group shared_domain(shareddomain); // Irrelevant
    privatekey = new DH_PrivateKey(rng, shared_domain); //[PROBLEM 1]
    MemoryVector<unsigned char> pubkey = privatekey->public_value();
    publickey = &pubkey;[PROBLEM 2]

我现在将描述问题:

问题1:私钥指针仍指向0x00,它不指向新实例化的对象,后来导致分段错误。 问题2:与publickey相同,当我在堆栈上创建“pubkey”然后将publickey指针指向其地址时,publickey只保留0x00。

任何帮助将不胜感激。我希望这很简单!

谢谢你们。

4 个答案:

答案 0 :(得分:4)

您的参数按值传递。

这意味着,如果修改函数内指针privatekey的值,则只修改该函数的局部变量。

您可能希望更改函数签名以接受参数作为引用:

void generatekeys(Something *& Apub, Something *& Apriv) { ... }

从右到左阅读:Apub是指针&*的引用Something。现在,对Apub内的Aprivgeneratekeys的任何更改都会根据需要传播到外部,但请注意,您需要调用该函数传递适当的变量(左值),而不仅仅是一些表达式(rvalues)。

如有疑问,请进一步询问或使用谷歌参考参数。

答案 1 :(得分:1)

您的问题是dh_generatekeysprivatekeypublickey取值(即指针的值)。因此,您修改的是指针的本地副本,而不是指针。解决方案只是将指针或引用传递给指向对象的指针,所以:

void encryptionalgorithm::dh_generatekeys(string shareddomain,DH_PrivateKey** privatekey, MemoryVector<unsigned char>** publickey)

void encryptionalgorithm::dh_generatekeys(string shareddomain,DH_PrivateKey*& privatekey, MemoryVector<unsigned char>*& publickey)

答案 2 :(得分:0)

如果我理解正确,我们应该将dh_generatekeys更改为:

void encryptionalgorithm::dh_generatekeys(string shareddomain,DH_PrivateKey* &privatekey,MemoryVector<unsigned char>* &publickey) { ... }

也就是说使用对指针的引用。这样你就可以改变它们。

答案 3 :(得分:0)

您需要传递指针的地址(或引用)才能修改调用者中的值。

指针的地址(指向指针的指针)示例:

int main(int argc, char** argv)
{   
    DH_PrivateKey *Apriv = 0;
    MemoryVector<unsigned char> *Apub = 0;
    AutoSeeded_RNG rng;
    DL_Group domain("modp/ietf/3072");
    encryption::dh_generatekeys("modp/ietf/3072",&Apriv,&Apub); //Passing address of pointers
    //...
}

void encryptionalgorithm::dh_generatekeys(string shareddomain,DH_PrivateKey **privatekey,MemoryVector<unsigned char> **publickey)
{
    AutoSeeded_RNG rng; // Irrelevant
    DL_Group shared_domain(shareddomain); // Irrelevant
    *privatekey = new DH_PrivateKey(rng, shared_domain); //dereference to assign
    MemoryVector<unsigned char> pubkey = privatekey->public_value();
    *publickey = &pubkey; //dereference to assign
    //...
}