проблемы с указателями - PullRequest
1 голос
/ 18 марта 2011

проблемы с ошибками указателя ...

Тем временем я уже несколько недель занимаюсь с ++, но снова столкнулся с этой проблемой.

В основном мне даны эти классы. Я не могу их изменить. Я начинаю с экземпляра _ns3__importAuftragResponse kout;

class SOAP_CMAC _ns3__importAuftragResponse
{
public:
        ns2__SOAPImportResult *return_;
         ...




class SOAP_CMAC ns2__SOAPImportResult
{
public:
        bool *error;   
        int *numberOfIgnoreds; 
        ....

Мой код должен проверить числоOfIgnoreds

первый подход

ns2__SOAPImportResult* imp_result;
imp_result = kout.return_;

int num;
num = *imp_result->numberOfIgnoreds;

или я использую

ns2__SOAPImportResult imp_result;
imp_result = *(kout.return_);
int* num;
*num = *imp_result.numberOfIgnoreds;

Я чаще всего получаю ошибку сегментации Я вообще знаю, что происходит во время выполнения, но не могу придумать правильную оду. Пожалуйста, помогите.

EDIT

добился прогресса благодаря твоему ответу, Наваз, но все еще нужно немного понимания

ns2__SOAPImportResult * imp_ptr = new ns2__SOAPImportResult;
imp_ptr = kout.return_;
int * num = new (int);
// next line segfaults
*num = *imp_ptr->numberOfIgnoreds;

что мне трудно понять, так это то, как или зачем выделять память для чего-то, что уже «там», поскольку есть элемент return_ объекта kout

Так правильно ли говорить, что мне нужно выделить память для переменной, которой я ее назначаю (которая, конечно, того же типа)?

Ответы [ 2 ]

2 голосов
/ 18 марта 2011

Скорее всего, вы не выделили память для следующих членов, которые вы используете в коде, который вы цитировали.

ns2__SOAPImportResult *return_; //in the class _ns3__importAuftragResponse 


int *numberOfIgnoreds;  //in the class  ns2__SOAPImportResult

Кроме этого, я не вижу ничего, что может пойтинеправильно!

Убедитесь, что вы выделяете память для этих элементов (и всех других указателей в вашей программе) , прежде чем использовать их .Вы можете использовать new для выделения памяти.Или вы также можете использовать malloc().Что бы вы ни использовали, используйте это последовательно и освободите память, как только вы это сделаете, используя delete или free() соответственно!

1 голос
/ 18 марта 2011

Это выглядит как gsoap .В этом случае вы должны использовать soap_malloc для выделения памяти, которую вы возвращаете.

Например, на странице FAQ вы найдете этот пример:

int ns__itoa(struct soap *soap, int i, char **a)
{ *a = (char*)soap_malloc(soap, 11);
  sprintf(*a, "%d", i);
  return SOAP_OK;
}
...