Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Работа с динамическими массивами.


Автор: Arvest 8.4.2018, 13:36
Приветствую.
Возникла необходимость в старый софт, написанный на С++ Builder, добавить работу с web-сервисом (SOAP).
Пришлось вспоминать С++ 
Через импорт WSDL получил модуль работы с web-сервисом.
В файле .h есть такой спецификатор:
Код

typedef DynamicArray<itemTO*>     itemListTO;  

/*Сам класс itemTO*/
class itemTO: public TRemotable {
private:
  __int64         FidHistory;
  bool            FidHistory_Specified;
  UnicodeString   Fsurname;
  bool            Fsurname_Specified;

...
public:
  __fastcall ~itemTO();
__published:
  __property __int64     idHistory = { index=(IS_OPTN | IS_UNQL), read=FidHistory, write=SetidHistory, stored = idHistory_Specified };
  __property UnicodeString    surname = { index=(IS_OPTN | IS_UNQL), read=Fsurname, write=Setsurname, stored = surname_Specified };

А также описание функции сервиса:
Код

virtual itemListTO      getData(const UnicodeString arg0, const UnicodeString arg1) = 0;

Как правильно работать с объектом itemListTO с точки зрения работы с памятью? Создать, удалить?
Сам вызов метода:
Код

void __fastcall TForm1::BitBtn1Click(TObject *Sender) {
try {
    _di_Service WebService = GetService(True, "", NULL);
    itemListTO data;
    data = WebService->getData("test_login","test_pass");
    for (int i = 0;i < data.Length ; i++)
    {
         Memo1->Lines->Add(data[i]->surname);
    }
    for (int i = 0;i < data.Length ; i++)
    {
         delete[] data[i];
    }
    WebService ->Release();
}

Заранее спасибо за советы.

Автор: Alexeis 8.4.2018, 13:52
Цитата(Arvest @  8.4.2018,  14:36 Найти цитируемый пост)
Как правильно работать с объектом itemListTO с точки зрения работы с памятью? Создать, удалить?

Оно работает примерно как и обычный вектор std::vector . Этот класс создан для совместимости с динамическими массивами Delphi.
Объект сам уничтожится когда выйдет за границу видимости, а вот что будет с элементами itemTO* вопрос. Указатели сами не освобождаются. Или у них есть постоянный владелец, который отвечает за удаление или нужно читать документацию. 

Автор: Arvest 9.4.2018, 15:48
Привожу сами файлы, полученные после импорта WSDL
В данных файлах: itemListTO = servListTO,  itemTO = servTO. В своем примере я переименовал их чтобы более наглядно было.

Автор: Arvest 9.4.2018, 15:49
Файл .h

Как я понимаю, все же правильно будет делать так:
Код

void __fastcall TForm1::BitBtn1Click(TObject *Sender) {
    try {
        _di_Ident WebIdent = GetIdent(True, "", NULL);

        if (!WebIdent) {
            ShowMessage("Объект _di_Ident WebIdent не создан");
            Application->Terminate();
        }
        identTO *ident = new identTO;
        servListTO data;
        data = WebIdent->getVmuData("test_login","test_pass", ident);
        for (int i = 0;i < data.Length ; i++)
        {
           Memo1->Lines->Add(data[i]->surname);
        }
        for (int i = 0;i < data.Length ; i++)
        {
           delete data[i];  // Удаляем объект servTO
        }
        delete ident; 
        WebIdent->Release();
    }
    catch (NS_Ident::Exception &ex) {
        Memo1->Lines->Add(ex.message);
    }
    catch (NS_Ident::Exception2 &ex) {
        Memo1->Lines->Add(ex.message);
    }
    catch (...) {
        Memo1->Lines->Add("Неизвестная ошибка");
    }
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)