我刚刚开始使用C++中的RAII并设置一个小测试用例.要么我的代码深感困惑,要么RAII无效!(我想这是前者).
如果我跑:
#include <exception>
#include <iostream>
class A {
public:
A(int i) { i_ = i; std::cout << "A " << i_ << " constructed" << std::endl; }
~A() { std::cout << "A " << i_ << " destructed" << std::endl; }
private:
int i_;
};
int main(void) {
A a1(1);
A a2(2);
throw std::exception();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
除了注释外我得到:
A 1 constructed
A 2 constructed
A 2 destructed
A 1 destructed
Run Code Online (Sandbox Code Playgroud)
正如所料,但除了我得到:
A 1 constructed
A 2 constructed
terminate called …Run Code Online (Sandbox Code Playgroud) 我用C++开始了一个项目.这种语言的内存管理对我来说是新的.
我曾经创建对象,new ()然后传递指针,虽然它工作,但调试很痛苦,人们看到代码时看着我很有趣.我很自豪它没有泄漏或段错(一旦修复),但它确实付出了很多努力.
list <struct Connection *> users;
struct Connection * accept_connection (const char *name) {
struct Connection * new_node = new Connection ();
new_node->_data = ... // whatever, set it up here
return new_node;
}
struct Connection * new_user = accept_connection (const char *name);
users.append (new_user);
Run Code Online (Sandbox Code Playgroud)
所以我为这个项目的下一个版本制定了新战略.到目前为止,我正在做的是创建对象new ()并为其分配唯一的整数ID号.然后,我使用ID作为键将对象存储在散列表中.现在,项目以整数ID号存储和传递,当您需要取消引用它时,您将转到哈希表并返回thing *或者NULL.因此,我不再遇到指针错误,但代码的速度有所降低.
typedef unsigned long ID_Number;
// create a user and return the ID
ID_Number create_user () {
ID_Number new_id = assign_unique_id ();
struct …Run Code Online (Sandbox Code Playgroud) 在C/C++编程时,我已经阅读了很多程序员的说法和写作,有很多与内存有关的问题.我打算学习用C/C++编程.我对C/C++有初学者知识,我想看一些简短的示例,说明为什么C/C++会出现内存管理问题.请提供一些样品.
从这里开始的讨论,我想知道以下代码是否有内存泄漏:
int main()
{
new int();
//or
int* x = new int();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我知道操作系统会回收内存,但无论如何它都是泄漏?我相信它是.
什么定义了内存泄漏?我只能在标准中找到一个参考,并没有太大帮助.
编辑:我不想开始辩论 - "我认为......"不是我正在寻找的那种答案.我最感兴趣的是 - C++书籍或网站或者其他任何关于它的内容.
我想存储10个Obj对象objList,但我不知道delete在这种情况下何时适当使用.如果我delete Obj;在下面代码中注明的行中使用,是否Obj仍然存储objList?
struct Obj {
int u;
int v;
};
vector<Obj> objList;
int main() {
for(int i = 0; i < 10; i++) {
Obj *obj = new Obj();
obj->u = i;
obj->v = i + 1;
objList.push_back(*obj);
// Should i use "delete Obj;" here?
}
}
Run Code Online (Sandbox Code Playgroud) 说我有一类称为Money具有参数Dollars和Cents
我可以通过以下两种方式初始化它:
我的问题是我应该何时使用(1)以及何时使用(2)
关于正确处理析构函数的相对简单的问题......
首先,我有一个类似这样的课程:
class Foo {
public:
ReleaseObjects() {
for (std::map<size_t, Object*>::iterator iter = objects.begin(); iter != objects.end(); iter++) {
delete (*iter).second;
}
objects.clear();
}
private:
std::map<size_t,Object*> objects;
}
Run Code Online (Sandbox Code Playgroud)
因此该函数只删除使用"new"创建的对象.问题是一个Object类:
class Bar : public Object {
public:
Bar() {
baz = new Baz();
}
~Bar() { delete baz; }
private:
Baz* baz;
}
Run Code Online (Sandbox Code Playgroud)
如果我向Foo添加一个类型Baz对象,然后尝试ReleaseObjects(),我会得到一个内存泄漏(valgrind).问题指向baz被泄露,我猜这意味着bar中的析构函数从未被调用过?所以我想知道的是在尝试销毁该对象时如何调用Bar析构函数(我不能改变Bar类,但我可以改变Foo).
编辑:哎呀,抱歉语法错误.无论如何,感谢所有的回复,愚蠢的我忘了在我的Baz课程中实现一个正确的析构函数!哦,Baz实际上是一个模板类,但我认为Baz与我的问题有点无关,而且问题是Bar中的析构函数没有被调用......好吧,我错了,毕竟问题出现在Baz中.但再次感谢,我想我从这里弄清楚了!
我有一个下面提到的C++代码:
#include<iostream>
#include<stdexcept>
const long MAX = 10240000;
class Widget{
public:
Widget(){
ok = new int [1024];
prob = new int [100*MAX];
}
~Widget(){
std::cout<<"\nDtoR of Widget is called\n";
delete ok; ok = NULL;
delete prob; prob = NULL;
}
//keeping below public: Intentionally
int* ok;
int* prob;
};
void func(){
Widget* pw = NULL; // <<<<--------------- Issue in Here
try{
pw = new Widget;
}
catch(...){
delete pw;
std::cout<<"\nIn catch BLOCK\n";
if(pw->ok == NULL){
std::cout<<"\n OK is NULL\n";
} …Run Code Online (Sandbox Code Playgroud) 我是Qt5的新手,正在学习QWidgets来开发应用程序。
我在许多示例中都注意到,QWidgets几乎总是通过指针访问的。例如:
#include <QApplication>
#include <QWidget>
#include <QFrame>
#include <QGridLayout>
class Cursors : public QWidget {
public:
Cursors(QWidget *parent = 0);
};
Cursors::Cursors(QWidget *parent)
: QWidget(parent) {
QFrame *frame1 = new QFrame(this);
frame1->setFrameStyle(QFrame::Box);
frame1->setCursor(Qt::SizeAllCursor);
QFrame *frame2 = new QFrame(this);
frame2->setFrameStyle(QFrame::Box);
frame2->setCursor(Qt::WaitCursor);
QFrame *frame3 = new QFrame(this);
frame3->setFrameStyle(QFrame::Box);
frame3->setCursor(Qt::PointingHandCursor);
QGridLayout *grid = new QGridLayout(this);
grid->addWidget(frame1, 0, 0);
grid->addWidget(frame2, 0, 1);
grid->addWidget(frame3, 0, 2);
setLayout(grid);
}
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
Cursors window;
window.resize(350, 150);
window.setWindowTitle("Cursors");
window.show();
return …Run Code Online (Sandbox Code Playgroud) 请查看以下代码
#include <iostream>
using namespace std;
class Memory
{
private:
int *memory;
public:
Memory()
{
memory = new int[3];
for(int i=0;i<3;i++)
{
memory[i] = i;
cout << memory[i] << endl;
}
}
~Memory()
{
delete[] memory;
}
};
int main()
{
cout << "Running" << endl;
Memory m;
// do I have to invoke ~Memory() ?
int *secondMemory = new int[5];
//How to clear the memory of 'secondMemory' ?
system("pause");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在这里,我已经清除memory了类的析构函数中动态分配的数组的内存.但我的问题是
这些问题在代码的适当位置作为注释询问.请帮忙!
编辑 …
c++ ×12
destructor ×2
memory-leaks ×2
pointers ×2
c ×1
c++11 ×1
exception ×1
memo ×1
new-operator ×1
qt ×1
qtwidgets ×1
raii ×1