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++等书籍,都没有说和调用约定有关
------解决方案--------------------
我还是那句话,进入函数体前构造完成,离开函数体后析构。
至于是前到什么程度,后到什么程度,我不知道,但是我能写出符合标准的代码。
------解决方案--------------------
dll导出函数应该C兼容,结构体应该传指针。
否则调用者问题多多。
------解决方案--------------------
导出类有很多限制
比如必须使用同版本的编译器
某些形式的参数必须要求动态链接C运行库。
无法兼容旧的dll等
不是说完全不行,是坑太多。
最著名的解决方案就是COM,但过于复杂,使用繁琐。
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++等书籍,都没有说和调用约定有关
------解决方案--------------------
我还是那句话,进入函数体前构造完成,离开函数体后析构。
至于是前到什么程度,后到什么程度,我不知道,但是我能写出符合标准的代码。
------解决方案--------------------
我还是那句话,进入函数体前构造完成,离开函数体后析构。
至于是前到什么程度,后到什么程度,我不知道,但是我能写出符合标准的代码。
进入函数体前构造完成,离开函数体后析构。
看过反汇编,被调用函数 ret 之前调用了析构函数;不知道会不会受其他因素影响
想到一个问题,如果在被调函数中析构,当使用不定参数的传了一个对象时,这个临时对象就无法被析构了
问题在于,如果调用的函数在另一个dll中是否会造成一个对象在一个模块(dll)中构造却在另一个模块中析构
所以模块设计时应该避免在返回值和参数中传递对象,只是用基本类型和指针
dll导出函数应该C兼容,结构体应该传指针。
否则调用者问题多多。
------解决方案--------------------
如果是通过工厂函数产生的抽象接口类的呢?
传结构体确实可能出问题,比如两个dll编译时使用了不同的字节对齐。所以应该传基本类型、指针,引用应该也没问题。
------------------------------------------------------------------------------
看过一些开源的库,比如 OGRE 里面就用了大量的导出类,并且存在很多返回对象的情况;但如果OGRE不使用导出类,那个这个引擎就没法用了
导出类有很多限制
比如必须使用同版本的编译器
某些形式的参数必须要求动态链接C运行库。
无法兼容旧的dll等
不是说完全不行,是坑太多。
最著名的解决方案就是COM,但过于复杂,使用繁琐。