Массив, созданный статически в DLL, перезаписывается при вызове программы - PullRequest
0 голосов
/ 07 апреля 2011

У меня есть основная программа (PMAIN), которая динамически использует DLL. Предположим, что PMAIN использует 2 функции (foo1, foo2 и foo3), экспортированные DLL. Функция выглядит примерно так:

int __stdcall foo1(){
  str = new MyStruct;
}
int __stdcall foo2(){
  str.LC->objF1();
}

int __stdcall foo3(int val){
  str.LC->objF2(val);
}

MyStruct выглядит так:

struct MyStruct{
  MyObject LC
}

И MyObject:

class MyObject{
 private:
  int arr1[100];
  int arr2[100];
  int Index;
 public:
  MyObject();
  ~MyObject();
  void objF1();
  void objF2(int val);
}

void MyObject::objF1(){
  for(int i=0;i<100;i++){
    arr1[i]=1;
  }
}

void MyObject::objF2(int val){
  Index++;
  arr2[Index]=val;
}
MyObject::MyObject(){
  for(int i=0;i<100;i++){
    arr1[i]=0;
    arr2[i]=0;
  }
  Index=-1;
}

Из PMAIN я сначала звоню foo1 , затем foo2 , затем я повторяю 100 раз, вызывая foo3; массив arr1 корректно обновляется и «сохраняет» значение в течение всего выполнения PMAIN, в то время как каждый раз, когда я вызываю foo3 массив arr2 содержит только нули, которые он получает обновляется, и когда программа снова вызывает foo3 , она снова пуста. Примерно так, как PMAIN перезаписывает адреса массива в DLL (я видел такое поведение при отладке).

Знаете ли вы, как это вообще возможно?

Разве PMAIN и DLL не должны находиться в двух разных местах памяти?

1 Ответ

0 голосов
/ 07 апреля 2011

Переменные, созданные в вашей DLL, - это те же переменные, которые использует программа, поэтому она может перезаписать их, если в вашей программе есть ошибка.

Это выглядит неправильно для меня:

int __stdcall foo1(){
  str = new MyStruct;
}
int __stdcall foo2(){
  str.LC->objF1();  
}

int __stdcall foo3(int val){
  str.LC->objF2(val);
}

Если str является указателем, (поскольку вы новичок в нем), тогда вам нужно использовать оператор-> для доступа к его членам.Вот так:

int __stdcall foo1(){
  str = new MyStruct;
}
int __stdcall foo2(){
  str->LC.objF1();
}

int __stdcall foo3(int val){
  str->LC.objF2(val);
}

и поскольку LC - не указатель, а просто автоматическая переменная в вашей структуре, то для этого нужно использовать . operator.Как исправлено выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...