Будем считать, что все, кто хотел, себя проверили.
Правильный ответ: #3.
Дело в том, что переменные gt_labst и gt_labst_copy являются указателями на объект памяти (memory object), который в нашем случае представлен телом внутренней таблицы.
При операции
Code:
gt_labst_copy = gt_labst.
копирования объктов памяти не происходит, просто указателей на него становится на один больше, поэтому ни распределённая, ни используемая память не расходуется.
А вот при операции (точнее, непосредственно перед ней)
Code:
DELETE gt_labst_copy WHERE matnr IS NOT INITIAL.
происходит копирование объектов памяти, поскольку через одну из ссылок модифицируется сам объект памяти. Как справедливо заметил nicky555, при операции удаления записей из внутренней таблицы освобождения распределённой памяти не происходит. Следовательно, объём занимаемой распределённой памяти удваивается.
Подробнее об этом можно почитать здесь
https://www.sdn.sap.com/irj/servlet/prt/portal/prtroot/com.sap.km.cm.docs/library/webas/Save%20Time%20and%20Effort%20with%20ABAP%20Memory%20Inspector.pdfВоочию убедиться в вышесказанном можно, проследовав в дебаггере на каждой из точек останова по следующему пути меню: Перейти к - Просмотр статусов - Занимаемая память. Необходимая информация находится на закладке Потребл. памяти - ранг. списки.
С вашего позволения приведу ещё одну задачку
Code:
REPORT zef_test3 NO STANDARD PAGE HEADING.
PERFORM get_data.
PERFORM write_data.
*&--------------------------------------------------------------------*
*& Form get_data
*&--------------------------------------------------------------------*
FORM get_data.
TABLES:
mard
.
SELECT matnr
INTO CORRESPONDING FIELDS OF mard
FROM mard
UP TO 1 ROWS.
ENDSELECT.
ENDFORM. "get_data
*&--------------------------------------------------------------------*
*& Form write_data
*&--------------------------------------------------------------------*
FORM write_data.
WRITE mard-matnr.
ENDFORM. "write_data
Вопрос: сколько строк выведет программа на экран при условии, что в таблице MARD 1000 записей?