返回的结构调用它自己的析构函数,用于销毁分配的对象
Returned struct calls it's own destructor that destroys allocated object
NewSocketException((:
SocketException NewSocketException(string callstack,Socket* socket)
{
SocketException se;
se.callStack = callstack;
se.message = GetLastWinsockErrorMessage(&se.code);
if (socket != nullptr)
se.socket = new Socket(*socket);
return se;
}
NewSocketException()
应该为我创建SocketException
结构并返回它。当执行return se;
时,C++调用se.~SocketException()
(它删除se.socket
(。我想这是因为se
超出了范围,但它也被返回了,所以我不知道这里到底发生了什么。当这一行完成时:
SocketException se = NewSocketException("accept() in AcceptThread()",server);
se
包含正确的字符串(通过进入,我注意到字符串也被~basic_string((破坏,但当函数返回时它们仍然存在(和正确的(相同的(指针值,但objet(se.socket(仍然被破坏。为什么要调用析构函数?为什么我的物体不见了,琴弦还在?
您从函数返回一个局部变量se
,当代码到达函数的最后一个大括号时,其作用域结束。所以它会叫驱逐舰。
若要解决此问题,请在调用函数之前定义一个变量,并将其作为参数传递给函数。
SocketException se;
void NewSocketException(string callstack,Socket* socket, SocketException &se)
{
se.callStack = callstack;
se.message = GetLastWinsockErrorMessage(&se.code);
if (socket != nullptr)
se.socket = new Socket(*socket);
}
相关文章:
- 开放 CV 中的动态内存分配,用于视频处理
- 动态分配列表 - 创建一个函数,用于删除所有包含偶数值的元素
- 基于浅树的数据结构的内存分配器,用于频繁分配和解除分配
- make_pair和大括号 { } 之间的区别,用于在C++中分配一对?
- C++将shared_ptr用于连续分配的内存
- 本地分配的内存是否可以用于将来使用?
- 在 C++ 中,用于将大型 2D 数组转换为 1D 数组的内存分配
- 用于删除复制/移动分配运算符的有效签名
- 用于批处理分配的库
- COPY分配被禁用于C 11中的线程
- 用于创建 HDF5 数据集的 4 维 c++ 数组的动态内存分配
- 好的设计?用于分配的智能指针与用于访问的原始指针相结合
- C++ - 重载'=',用于将十六进制值分配给对象
- 此TreeVisitor函数如何用于此二进制搜索树分配
- (C++)用于实例化新对象并将其分配给指向相同对象类型的指针的 2D 向量的语法
- 分配参数用于测试目的
- 为什么 ::运算符关键字添加到 new 之前用于内存分配
- 用于堆分配的对象的设置器
- 用于分配和检索的括号过载;const,引用
- 内存管理——用于分配/释放I/O缓冲区的现代c++风格