您能否请C++开发人员详细介绍RAII是什么,为什么重要,以及它是否与其他语言有任何关联?
我做知道一点点.我相信它代表"资源获取是初始化".但是,这个名称并不符合我对RAII的理解(可能不正确):我得到的印象是RAII是一种初始化堆栈中对象的方式,当这些变量超出范围时,析构函数会自动被称为导致资源被清理.
那么为什么不称为"使用堆栈触发清理"(UTSTTC :)?你怎么从那里到"RAII"?
你怎么能在堆栈上创建一些东西来清理堆上的东西呢?此外,是否有不能使用RAII的情况?你有没有发现自己希望收集垃圾?至少一个垃圾收集器,你可以使用一些对象,同时让其他人管理?
谢谢.
在我们离开程序之前,为什么我们需要在任何情况下关闭FileInputStream(和一般的流)?否则会发生什么?如果程序在程序中明确关闭输入流之前停止,则流是否也会自动关闭?
我想学习如何在c ++中使用RAII.我想我知道它是什么,但不知道如何在我的程序中实现它.快速谷歌搜索没有显示任何好的教程.
有没有人有任何好的链接教我RAII?
假设我有以下代码段.
int main()
{
int num;
int* cost;
while(cin >> num)
{
int sum = 0;
if (num == 0)
break;
// Dynamically allocate the array and set to all zeros
cost = new int [num];
memset(cost, 0, num);
for (int i = 0; i < num; i++)
{
cin >> cost[i];
sum += cost[i];
}
cout << sum/num;
}
` `delete[] cost;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
虽然我可以delete在while循环中为我的代码移动语句,但为了理解目的,我想知道代码在编写时会发生什么.每次使用运算符时C++都会分配不同的内存空间new吗?
运算符delete只删除最后分配的cost数组吗?
我不明白delete当我想释放分配的内存时真正做了什么new.在C++ Premiere一书中写道:
这将删除ps指针指向的内存; 它不会删除指针ps本身.例如,您可以重用ps来指向另一个新分配.你应该总是平衡使用new和使用delete; 否则,您可能会遇到内存泄漏 - 即已分配但无法再使用的内存.如果内存泄漏变得太大,它可能会使程序寻求更多的内存停止.
据我所知,delete必须删除pinter指向的内存中的值.但事实并非如此.这是我的实验:
int * ipt = new int; // create new pointer-to-int
cout << ipt << endl; // 0x200102a0, so pointer ipt points to address 0x200102a0
cout << *ipt << endl; // 0, so the value at that address for now is 0. Ok, nothing was assigned
*ipt = 1000; // assign a value to that memory address
cout << *pt << endl; …Run Code Online (Sandbox Code Playgroud) 为什么以及何时需要提供自己的删除器?关键字不delete足够吗?
如果您使用智能指针来管理分配的内存以外的资源
new,请记住传递删除器.
正如在评论中被问到的那样,我不清楚引用的文本和示例的原因是我在想某些东西是错误的,这是因为我一直在考虑智能指针只是为了动态内存管理而发明的.所以这个例子使用智能指针管理非动态内存让我感到困惑.
老人的一个很好的解释:
智能指针根本不关心动态内存本身.它只是一种在需要时跟踪某些东西的方法,并在它超出范围时销毁它.提到文件句柄,网络连接等的要点是指出它们不是动态内存,但智能指针可以管理它们就好了.
C++ Primer 5th采用伪网络连接(不定义析构函数)来说明.
坏:
struct destination; // represents what we are connecting to
struct connection; // information needed to use the connection
connection connect(destination*); // open the connection
void disconnect(connection); // close the given connection
void f(destination &d /* other parameters */)
{
// get a connection; must remember to close it when done
connection c = connect(&d);
// use the connection
// if we …Run Code Online (Sandbox Code Playgroud) 我听说越来越多,我应该使用智能指针而不是裸指针,尽管我已经实现了有效的内存泄漏系统.
请问使用智能指针的正确编程方法是什么?它们是否真的应用,即使我检查分配的内存块上的内存泄漏?还是由我决定吗?如果我不使用它们,这可以被视为编程弱点吗?
如果强烈建议使用智能指针(例如:std :: auto_ptr),我应该使用它们而不是每个裸指针吗?
哪个选项是在Visual C++创建(和管理)的线程更好的:C++ 11 std::thread或WinAPI功能(如CreateThread,_beginthreadex等),为什么?
有没有办法知道你的程序是否在C++(甚至C)中有未定义的行为,而不是记住整个规范?
我问的原因是我注意到很多程序在调试中工作但没有发布是由于未定义的行为.如果有一个工具来至少帮助发现UB会很好,所以我们知道存在问题的可能性.
我有一个构造函数,使用new运算符分配几个内存块.
X::X() {
a = new int[100];
b = new char[100];
c = new float[100];
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,如果分配c失败,并且构造函数抛出异常,将会为内存a和b自动被删除?