Я сталкиваюсь со странной проблемой, которую я смог разыскать несколько, но я все еще не вижу причины. Возможно, кто-то здесь может пролить некоторый свет?
Я работаю на процессоре PowerPC сверх разработки VxWorks 5.5 в C++ с набором инструментальных средств PPCgnu604.
У меня есть класс как так:
class MyClass
{
public:
void run( void );
private:
CommandMesssageClass command;
StatusMessageClass status;
};
Когда мое приложение будет запущено, оно динамично выделит экземпляр MyClass и породит поток, указывающий на его функцию "выполнения". По существу это просто находится, там опрашивая относительно команд и, на получение, выпустит состояние назад.
Обратите внимание, что это - срубленная версия класса. Существует много других методов и переменных, не учтенных для краткости.
Проблема, которую я вижу, - когда и команда и сообщения о состоянии будут определены как частные участники класса, я получу изменение в доступных байтах в памяти несмотря на факт не должно быть никакого динамического выделения памяти. Это важно, потому что это происходит в какой потребности быть детерминированной и безопасной от уровня процедурой.
Если я перемещаюсь один или оба из объявлений сообщения в функцию выполнения, она хорошо работает без дополнительных ассигнований!
Я должен пропускать что-то фундаментальное в своем понимании объявлений C++ и выделения памяти. Мое понимание - то, что экземпляр класса, что я динамично instansiate буду полностью выделен на "куче" (включая все членские переменные), когда это будет создано. Различие, которое я вижу здесь, было бы то, что перемещение объявлений сообщения к функции выполнения помещает их на стек вместо этого. "Куча" в этом случае является более, чем достаточно большой к accompadate весь размер класса. Почему это, кажется, не выделяет достаточно памяти, пока определенные части не используются?
Классы сообщений не делают никакого динамического собственного выделения. (И если бы они сделали, то я ожидал бы перемещаться, объявление не изменило бы поведение в этом случае, и я все еще видел бы изменение в размере "кучи".)
Для контроля выделения памяти, я использую следующий VxWorks memLib (или memPartLib) вызов:
memPartInfoGet( memSysPartId, &partitionStatus );
...
bytesFree = partitionStatus.numBytesFree;
Править:
Для разъяснения объект MyClass является instansiated и инициализированный в стандартной программе инициализации, и затем код вводит безопасную от уровня обработку. В это время на получение сообщения команды по последовательной линии (первое взаимодействие с объектами Команды или Сообщения о состоянии) дополнительная память выделяется (или скорее число байтов бесплатные уменьшения). Это плохо, потому что динамическое выделение памяти не детерминировано.
Я смог избавиться от проблемы путем перемещения переменных класса, как я описал.