2009-08-27 2 views
0

У меня есть функция, которая называет себя 10 раз в секунду. Я использую QTimer для повторных вызовов.Передача Массив объектов Состоит из других объектов в качестве ссылки на функции в C++?

void DisplayClass::UpdateGuiWithData() 

{ 

//miscellaneous code which is validated 

SingletonObjectAsThread::instance()->UpdateFromGuiToExternalHardware(ClassOjbectArray,var1,var2); 

QTimer::singleShot(100,this,SLOT(UpdateGuiWithData())); 

} 


Class A_ComposingClass_B_Object 

{ 

//boolean and enum variables 

B ArrayOf_B_Objects[16]; 

} 

Class B 

{ 

//boolean and enum vairables 

} 

class DisplayClass 

{ 

//variables that are not a concern here 
UpdateGuiWithData(); 
A ArrayOfObject_A[4]; 

}; 

Class SingletonAsThread 

{ 

//vairables that are not a concern here 

UpdateFromGui(A_ComposingClass_B_Object*,const bool&,const bool&); 

}; 

Вот дело, когда я запускаю код, как есть, есть устойчивый рост объема памяти, но когда я закомментировать вызов к UpdateFromGui вызова в классе UpdateGuiWithData, память остается на постоянном уровне около 51 МБ. Функция UpdateFromGui не имеет функций динамической памяти или графического интерфейса. Это просто функция плоскости jane, которая создает пакет для записи в последовательный порт и вызывается 10 раз в секунду, поскольку это частота обновления аппаратного обеспечения.

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

// Получить массив по ссылке.

void GetArray(int (&Array) [10]) 

{ 

} 

// Test array by reference. 

void CRabbitDlgDlg::TestArray() 

{ 

    // Pass array by reference. 

    int Array[10] = { 0 }; 

    GetArray(Array); 

} 

Мой вопрос являются

---> Могу ли я думать на прямой линии или что-то делать с повторным вызовом Синглтон

объект класса?

---> Также мне нужен конструктор копирования здесь для класса А, хотя нет динамических

распределения или указатель переменных в этом классе?

---> Что еще может быть источником этой утечки памяти (если не его не о конструкторе копирования или одноэлементных вызовах), которая постоянно увеличивает использование памяти

приложения?

+0

Кажется маловероятным, что передача массива указателей на функцию вызовет утечку памяти. Я утверждаю, что либо вы не получаете утечки памяти, но все равно использование памяти идет вверх или вы делаете что-то другое, что вызывает утечку. В любом случае требуется больше кода. – Goz

ответ

1

Массивы в C и C++ не работают так, как вы описали. То, что мы называем «массивом», представляет собой область памяти, где объекты расположены рядом друг с другом, и указатель, указывающий на первый объект. Когда вы передаете указатель на функцию, вы просто передаете одно целое число. Объект, на который он указывает, не копируется, и он продолжает указывать на тот же непрерывный фрагмент памяти.

То, с чем вы столкнулись, является настоящей утечкой памяти. Вы где-то выделяете память и забываете освободить ее, когда она больше не нужна. Или вы вводите рекурсию там, где вы этого не хотели, и каждая функция выделяет некоторую память в стеке.

И ваш клод плохо представлен - я не могу найти объявления, о которых вы говорите сразу после окна кода.

+0

@Pavel: Я не мог найти объявление функции, которая принимает массив объектов для функций, то есть один из вопросов, которые я задал? – rocknroll

+0

вы не можете объявить массив указателей на функции в C и C++ в одном операторе.Вы либо используете typedef для определения типа указателя funciton, а затем объявляете массив этого типа, или вместо объявления массива вы просто объявляете указатель на указатель. Например: int (** array_of_function_pointers)(); –

+0

@pavel: sorry mate i означает «массив объектов», а не массив объектов для функций. – rocknroll

Смежные вопросы