BDD 操作に CUDD パッケージを使用しています。DdManager と呼ばれる大きなデータ構造のコピーを作成したいと考えています。問題は、このデータ構造には内部に非常に多くのポインターがあるため、直接コピーを作成すると、それは「浅い」コピーになります (用語を使用する人もいます)。つまり、新しいコピーのポインターは、指定された同じ場所を指します元のコピーによって、だから私はそれらのいずれかを変更すると、望ましくない他のものも変更します....データ構造が非常に大きく、多くのポインタで非常に詳細であるため、手動でコピー機能を作成しようとすることは現実的ではありません他の複雑な構造にも!!! ここで説明されているベクトル ソリューションを試しましたが、ネストされた構造体とポインターが多数あり、完全に新しいコピーが必要なため、期待した結果が得られませんでした。
これが私がやりたいことのコードサンプルです:
#include <iostream>
#include <cstdlib>
#include <string.h>
#include <vector>
using namespace std;
struct n1
{
int a;
char *b;
};
struct n2
{
int **c;
struct n1 *xyz;
};
typedef struct
{
vector<struct n2> x;
}X;
int main()
{
struct n2 s1;
s1.xyz = (struct n1*)malloc(sizeof(struct n1));
s1.xyz->a = 3;
s1.xyz->b = (char*)malloc(5);
s1.xyz->b[0] = '\0';
strcat(s1.xyz->b,"Mina");
s1.c = (int**)malloc(5 * sizeof(int*));
for(int i = 0; i < 5; i++)
s1.c[i] = (int*)malloc(5 * sizeof(int));
for(int i = 0; i < 5; i++)
for(int j = 0 ; j < 5 ; j++)
s1.c[i][j] = i + j;
X struct1,struct2;
vector<struct n2>::iterator it;
it = struct1.x.begin();
it = struct1.x.insert(it,s1);
it = struct2.x.begin();
it = struct2.x.insert(it,struct1.x[0]);
cout<<"struct2.x[0].c[1][2] = "<<struct2.x[0].c[1][2] <<" !"<<endl; // This is equal to 3
(struct2.x[0].c[1][2])++; //Now it becomes 4
cout<<"struct2.x[0].c[1][2] = "<<struct2.x[0].c[2][2] <<" !"<<endl; //This will print 4
cout<<"s1.c[1][2] "<< s1.c[1][2]<<" !"<<endl; // This will also print 4 ... that's the wrong thing
return 0;
}