关于类前置声名和对象整体作为函数参数传递

柯嘉 2004-12-22 12:08:43
请参考机械工业出版社那本《Thinking in c++》第二版第271页最后一段。
class X;

void fun(X*);

class X
{
public:
int m;
friend void fun(X*);
};

int main()
.
.
.
全局函数fun引用了类型X作为参数,因此必须在fun之前声名X,但在声名X之后、定义X之前,没人知道X的size,因此对X的引用只能使用其地址;如果要将X类型的对象整个作为函数参数传递(即fun(X)),则必须在引用前完整的定义类型X。
但我将fun(X*)改为fun(X)后,依然编译、运行良好。这么做会引起内存泄漏吗?作者的意思是什么呀?
...全文
158 22 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
ilovevc 2004-12-25
  • 打赏
  • 举报
回复
既然你从未new,何来memory leak一说。
goodluckyxl 2004-12-25
  • 打赏
  • 举报
回复
你告诉 怎么测试出内存泄露的?
这个和函数声明一样的我觉得
就象在翻译的时候
如果看到声明而没有定义编译器会标记这个名字的一个引用别名
在后面的连接的时候查找定义
不会那么脆弱 就直接导致泄露的 我认为
oyljerry 2004-12-25
  • 打赏
  • 举报
回复
给出leak 的proof
oyljerry 2004-12-25
  • 打赏
  • 举报
回复
又没new,怎么leak?
goodluckyxl 2004-12-25
  • 打赏
  • 举报
回复
真的 假的

别揭贴先
柯嘉 2004-12-25
  • 打赏
  • 举报
回复
结贴,检验结果是:会引起内存泄漏!!!
goodluckyxl 2004-12-25
  • 打赏
  • 举报
回复
显然不会
会产生一个调用的引用找到对应定义的地方
怎么可能泄露呢
look01 2004-12-24
  • 打赏
  • 举报
回复
不会
柯嘉 2004-12-24
  • 打赏
  • 举报
回复
// 拜托,再UP。没人解决,就结贴了,谢谢各位了。
class X;
void fun(X);

/*
Completed definition of class X
*/

int main()
{
X x;
fun(x);// 请参考主贴,我已经不知道如何表述了:会不会leak memory here
return 0;
}
ilovevc 2004-12-23
  • 打赏
  • 举报
回复
唉,看到最后,原来楼主根本不是想知道什么前置申明,#include的问题。
他连什么是声明,什么是行参,什么是实参都没有搞清楚。

class X;
void fun(X);//此时没人知道X的size,函数fun却将整个对象引用了,会不会leak

fun(X)表示函数需要一个X类型的参数,这些代码你不运行哪有什么leak。

建议多看书先。
柯嘉 2004-12-23
  • 打赏
  • 举报
回复
class X;

void fun(X);//此时没人知道X的size,函数fun却将整个对象引用了,会不会leak memory?
junnyfeng 2004-12-22
  • 打赏
  • 举报
回复
在void fun(X*);之前不需要知道X的大小,只要知道有它存在,而且是个class就够了
aleon 2004-12-22
  • 打赏
  • 举报
回复
在函数声明的时候,如果类只是用作形参和返回值类型的时候,是不需要类定义的。
柯嘉 2004-12-22
  • 打赏
  • 举报
回复
PS:大佬们都用什么工具检测内存泄漏啊?
柯嘉 2004-12-22
  • 打赏
  • 举报
回复
不好意思,刚翻错了,应该是书的第265页,倒数第二段。
ilovevc 2004-12-22
  • 打赏
  • 举报
回复
那是因为你只有函数声明,只有函数定义的时侯才需要X。
例如:
class X;
void fun(X x); //函数声明,无需X定义。OK

但是:
class X;
void fun(X x) //函数定义,这就需要X的定义了。报错
{
}
liem 2004-12-22
  • 打赏
  • 举报
回复
用void fun(X&);不好吗?
beyondtkl 2004-12-22
  • 打赏
  • 举报
回复
void fun(X*); -> 這是傳一個指針而已 不需要大小..

void fun(X); -> 這樣 編譯器必須要等到看到了class X的聲明 以及明確其copy constructor之類的聲明 才能決議。。
xuzheng318 2004-12-22
  • 打赏
  • 举报
回复
MemProof
到该站去下载
 http://www.automatedqa.com/
oyljerry 2004-12-22
  • 打赏
  • 举报
回复
前置申明
加载更多回复(2)

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧