相关疑难解决方法(0)

C++ RAII无法正常工作?

我刚刚开始使用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++ exception raii

13
推荐指数
5
解决办法
1299
查看次数

C++内存管理技术/实践

我用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++ memory-management

10
推荐指数
1
解决办法
7265
查看次数

为什么C/C++有内存问题?

在C/C++编程时,我已经阅读了很多程序员的说法和写作,有很多与内存有关的问题.我打算学习用C/C++编程.我对C/C++有初学者知识,我想看一些简短的示例,说明为什么C/C++会出现内存管理问题.请提供一些样品.

c c++ memory-management memo

8
推荐指数
4
解决办法
924
查看次数

是不是在动态分配的对象上调用delete总是内存泄漏?

从这里开始的讨论,我想知道以下代码是否有内存泄漏:

int main()
{
   new int();
   //or
   int* x = new int();
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

我知道操作系统会回收内存,但无论如何它都是泄漏?我相信它是.

什么定义了内存泄漏?我只能在标准中找到一个参考,并没有太大帮助.

编辑:我不想开始辩论 - "我认为......"不是我正在寻找的那种答案.我最感兴趣的是 - C++书籍或网站或者其他任何关于它的内容.

c++ memory-leaks memory-management

6
推荐指数
2
解决办法
543
查看次数

何时使用"删除"?

我想存储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)

c++ memory-management

5
推荐指数
2
解决办法
1万
查看次数

如何解释这句话"函数中的指针不应代表所有权"

基于此

Stroustrup建议"函数中的指针不应代表所有权"

问题 >有人可以给我一些细节解释吗?如果说明一个例子,那就最好.

谢谢

c++ c++11

3
推荐指数
2
解决办法
214
查看次数

什么时候应该在C++中使用new运算符

说我有一类称为Money具有参数Dollars和Cents

我可以通过以下两种方式初始化它:

  1. 钱a(3,15);
  2. 钱*b =新钱(3,15);

我的问题是我应该何时使用(1)以及何时使用(2)

c++ new-operator

2
推荐指数
2
解决办法
511
查看次数

C++析构函数内存泄漏

关于正确处理析构函数的相对简单的问题......

首先,我有一个类似这样的课程:

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++ destructor memory-leaks delete-operator

2
推荐指数
1
解决办法
2664
查看次数

对异常处理的C++编程实践的困惑

我有一个下面提到的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)

c++ exception-handling

2
推荐指数
1
解决办法
202
查看次数

为什么QWidgets被指针访问?

我是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)

c++ qt pointers qtwidgets

2
推荐指数
2
解决办法
443
查看次数

智能指针如何知道何时在程序崩溃时释放资源?

使用像unique_ptr这样的智能指针的c ++项目如何知道在程序崩溃时释放资源?

c++

1
推荐指数
1
解决办法
101
查看次数

如何清除动态分配的内存,这是在堆中?

请查看以下代码

#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了类的析构函数中动态分配的数组的内存.但我的问题是

  1. 我必须调用~Memory()吗?
  2. 如何清除'secondMemory'的记忆?

这些问题在代码的适当位置作为注释询问.请帮忙!

编辑 …

c++ pointers destructor visual-studio-2010

-3
推荐指数
1
解决办法
2万
查看次数