c++ 析构函数 参数

场景:c++ 使用值传参数时,拷贝构造函数跟析构函数什么时候被调用

c++ 使用值传参数时,拷贝构造函数和析构函数什么时候被调用
分别是在主调函数中调用,还是被调用函数中调用?

是否和调用约定有关?

或者是未指定行为?

------解决方案--------------------
引用传递和指针传递不会调用,因为没有创建新对象

都是在被掉函数中调用,除非主调函数在调用时使用临时变量.
------解决方案--------------------
进入函数体前构造完成,离开函数体后析构。
------解决方案--------------------
在那行代码中完成构造和析构。
按你的说法,构造和析构都是在主调函数中完成的。
------解决方案--------------------
例如
class unicode2ansi
{
public:
   unicode2ansi(wchar_t*);
   operator const char*();
};

void abc(const char* str);


那么
abc(unicode2ansi(L"哈哈"));
是正确的。unicode2ansi对象在abc调用之前构造,在调用完成之后析构。abc不了解unicode2ansi的细节,它的内部是不可能做到析构unicode2ansi临时对象的。



------解决方案--------------------
看过C++ premier和more effective c++等书籍,都没有说和调用约定有关
------解决方案--------------------
我还是那句话,进入函数体前构造完成,离开函数体后析构。
至于是前到什么程度,后到什么程度,我不知道,但是我能写出符合标准的代码。

引用:
Quote: 引用:

进入函数体前构造完成,离开函数体后析构。


看过反汇编,被调用函数 ret 之前调用了析构函数;不知道会不会受其他因素影响


想到一个问题,如果在被调函数中析构,当使用不定参数的传了一个对象时,这个临时对象就无法被析构了

------解决方案--------------------
引用:
Quote: 引用:

我还是那句话,进入函数体前构造完成,离开函数体后析构。
至于是前到什么程度,后到什么程度,我不知道,但是我能写出符合标准的代码。

Quote: 引用:

Quote: 引用:

进入函数体前构造完成,离开函数体后析构。


看过反汇编,被调用函数 ret 之前调用了析构函数;不知道会不会受其他因素影响


想到一个问题,如果在被调函数中析构,当使用不定参数的传了一个对象时,这个临时对象就无法被析构了


问题在于,如果调用的函数在另一个dll中是否会造成一个对象在一个模块(dll)中构造却在另一个模块中析构

所以模块设计时应该避免在返回值和参数中传递对象,只是用基本类型和指针

dll导出函数应该C兼容,结构体应该传指针。
否则调用者问题多多。
------解决方案--------------------
引用:
如果是通过工厂函数产生的抽象接口类的呢?

传结构体确实可能出问题,比如两个dll编译时使用了不同的字节对齐。所以应该传基本类型、指针,引用应该也没问题。

------------------------------------------------------------------------------

看过一些开源的库,比如 OGRE 里面就用了大量的导出类,并且存在很多返回对象的情况;但如果OGRE不使用导出类,那个这个引擎就没法用了

导出类有很多限制
比如必须使用同版本的编译器
某些形式的参数必须要求动态链接C运行库。
无法兼容旧的dll等

不是说完全不行,是坑太多。
最著名的解决方案就是COM,但过于复杂,使用繁琐。