私は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 のままになります。
どんな助けでも大歓迎です。それが簡単なものであることを願っています!
みんなありがとう。