传递由其他对象组成的对象数组作为对C++中函数的引用?

Posted

技术标签:

【中文标题】传递由其他对象组成的对象数组作为对C++中函数的引用?【英文标题】:Passing Array of objects Composed of other objects as reference to Functions In C++? 【发布时间】:2009-08-27 04:57:34 【问题描述】:

我有一个每秒调用 10 次的函数。我正在使用 QTimer 进行重复呼叫。

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&);

;

当我按原样运行代码时,内存大小稳步增加,但是当我在 UpdateGuiWithData 类中注释掉对 UpdateFromGui 的调用时,内存保持在 51 MB 左右的恒定水平。 UpdateFromGui 函数没有动态内存分配或 GUI 函数。它只是一个平面简函数,它构造要写入串行端口的数据包,并且每秒调用 10 次,因为这是硬件的刷新率。

我能想到内存增加的唯一原因是每次调用 UpdateFromGui 函数时都会传递对象数组。我认为每次调用我们都会创建类对象的副本,因此会增加内存。 然后我尝试使用传递对象数组作为对函数的引用,但找不到适合此类函数的声明,虽然我找到了这样一个函数的定义和用法。这是我在网上找到的。

// 通过引用接收数组。

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





// Test array by reference.

void CRabbitDlgDlg::TestArray()



    // Pass array by reference.

    int Array[10] =  0 ;

    GetArray( Array );


我的问题是

--->我的想法是正确的还是与重复调用单例有关

类对象?

--->我还需要A类的复制构造函数,虽然没有动态

这个类中的分配或指针变量?

--->还有什么可能是这种内存泄漏的来源(如果不是关于复制构造函数或单例调用),它会不断增加内存使用量

应用程序?

【问题讨论】:

似乎不太可能将指针数组传递给函数会导致内存泄漏。我认为要么您根本没有发生内存泄漏,但内存使用量无论如何都会上升,或者您正在做其他导致泄漏的事情。无论哪种方式都需要更多代码。 【参考方案1】:

C 和 C++ 中的数组不能按照您描述的方式工作。我们所说的“数组”只是一个内存区域,其中对象彼此相邻放置,以及指向第一个对象的指针。当您将指针传递给函数时,您只需传递一个整数。它指向的对象没有被复制,它一直指向同一个连续的内存块。

您遇到的是真正的内存泄漏。当不再需要时,您在某处分配内存并忘记释放它。或者你在不想要的地方进入递归,每个函数在堆栈中分配一些内存。

而且你的 clode 呈现得很糟糕——我找不到声明,你在代码窗口之后就在谈论它。

【讨论】:

@Pavel:我找不到接受函数对象数组的函数声明,这是我问的问题之一? 您不能在 C 和 C++ 中在一个运算符中声明一组函数指针。您可以使用 typedef 定义函数指针类型,然后声明该类型的数组,或者不声明数组,而是声明指向指针的指针。像这样: int (** array_of_function_pointers) (); @pavel:对不起,我的意思是“对象数组”而不是函数对象数组。

以上是关于传递由其他对象组成的对象数组作为对C++中函数的引用?的主要内容,如果未能解决你的问题,请参考以下文章

C++,fstream 对象作为引用传递给函数,常量?

c++,类的对象作为形参时一定会调用复制构造函数吗?

java数组作为参数传入函数怎么让他不变化

请问,C++中的类的对象组成的动态数组怎么用sort()或qsort()排序?

使用构造函数将数组传递给对象后,值已更改(在 c++ 中)。我想不通为啥

C++ 多线程std::thread 详解