我是 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。
如有任何帮助,我们将不胜感激。我希望这很简单!
谢谢大家。
最佳答案
您的参数按值传递。
这意味着,如果您修改函数内指针 privatekey
的值,您只会修改该函数的本地变量。
您可能想要更改函数签名以接受参数作为引用:
void generatekeys(Something *& Apub, Something *& Apriv) { ... }
从右向左读取:Apub
是对指向 Something
的指针 *
的引用 &
。现在,对 generatekeys
内的 Apub
和 Apriv
进行的任何更改都将根据需要传播到外部,但请注意,您需要调用该函数传递适当的变量(左值),而不仅仅是一些表达式(右值)。
如有疑问,请进一步询问或通过 Google 获取引用参数。
关于c++ - 在 C++ 中实例化指向新对象的指针时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11294816/