以下是我的示例代码。基类有一个A类的指针,使用新的运算符从堆中分配了内存。我明确地抛出异常。由于我没有在* ptr上调用delete,因此不会释放new分配的内存。由于对象不是完全构造的,我们如何释放内存?
#include <iostream>
using namespace std;
class A
{
public:
A()
{
cout<<"A::ctor"<<endl;
}
~A()
{
cout<<"A::Dctor"<<endl;
}
};
class Base
{
public:
A *ptr;
Base()
{
ptr = new A();
cout<<"Base::Ctor"<<endl;
throw std::exception();
}
~Base()
{
delete ptr;
cout<<"Base::Dtor"<<endl;
}
};
int main()
{
try{
Base bobj;
}
catch(exception e)
{
cout<<e.what();
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当Base构造函数引发异常时,控件将捕获块并处理异常。但是ptr = new A();释放的内存如何分配?
现在,我知道使用智能指针可以解决此问题。但是在C ++ 11之前,如何处理这种情况。
另外,我想知道我们如何关闭在构造函数中打开的文件处理程序的文件处理程序,并且构造函数有异常?
Base()
{
ofstream myfile;
myfile.open("myfile.txt");
..........
throw std::exception();
}
~Base()
{
myfile.close(); …Run Code Online (Sandbox Code Playgroud) 我有一个关于复制构造函数的问题.
如下定义的构造函数,我们称之为复制构造函数还是仅仅是重载的构造函数?
A(const A& obj,int x, char y='A')
我有一个下面的代码有时会出现分段错误?
vector<int> myvector;
void function1()
{
for(int i = 0;i<10;i++)
{
cout<<"writer thread:"<<i<<endl;
myvector.push_back(i);
}
}
void function2()
{
for(int i = 0;i<10;i++)
{
cout<<"reader thread:";
cout<<myvector[i]<<endl;
}
}
int main()
{
thread t1(function1);
thread t2(function2);
t1.join();
t2.join();
}
Run Code Online (Sandbox Code Playgroud)
我对一般容器和特别是向量的线程安全规则/保证有点困惑。我在一次采访中被问到这个问题,但没有说清楚为什么在线程中写入和在其他线程中写入不是线程安全操作。
在下面的向量 Push_back 链接中,我在数据争用部分看到“否则,不会访问任何现有元素,并且同时访问或修改它们是安全的”。该声明如何证明向量写入操作不是线程安全的?