相关疑难解决方法(0)

是否可以将自动引用计数(ARC)引入C++?

Objective C引入了一项名为ARC的技术,使开发人员免于内存管理的负担.这听起来不错,我认为如果g ++也有这个功能,C++开发人员会非常高兴.

ARC允许您将内存管理的负担放在(Apple LLVM 3.0)编译器上,从不再考虑保留,释放和自动释放

所以,如果LLVM3.0可以做到这一点,我认为g ++也可以让C++开发人员摆脱内存管理的艰巨任务,对吧?

将ARC引入C++有什么困难吗?

我的意思是:如果我们不使用智能指针,我们只使用new/ new[],编译器是否可以为我们做些什么来防止内存泄漏?例如,自动将新指针更改为智能指针?

c++ memory-management

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

这个C++代码是否会泄漏内存?

struct Foo
{
    Foo(int i)
    {
        ptr = new int(i);
    }
    ~Foo()
    {
        delete ptr;
    }
    int* ptr;
};

int main()
{
    {
        Foo a(8);
        Foo b(7);
        a = b;
    }
    //Do other stuff
}
Run Code Online (Sandbox Code Playgroud)

如果我理解正确,编译器将自动为其创建赋值运算符成员函数Foo.但是,这只需要输入ptrin 的值b并将其放入a.a最初分配的内存似乎丢失了.我可以a.~Foo();在进行赋值之前进行调用,但我听说你应该很少需要显式调用析构函数.所以让我们说我编写一个赋值运算符Foo,删除int左操作数的指针,然后将r值赋给l值.像这样:

Foo& operator=(const Foo& other) 
{
    //To handle self-assignment:
    if (this != &other) {
        delete this->ptr;
        this->ptr = other.ptr;
    }
    return *this;
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我这样做,那么当Foo aFoo …

c++ memory-leaks assignment-operator

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

使用std :: list <std :: string>时,std :: string会导致内存泄漏

std::list<std::string>在我目前的项目中工作.但是有一个与此相关的内存泄漏.所以我分别测试了有问题的代码:

#include <iostream>
#include <string>
#include <list>

class Line {
public:
    Line();
    ~Line();
    std::string* mString;
};

Line::Line() {
    mString = new std::string("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
}

Line::~Line() {
    //mString->clear(); // should not be neccessary
    delete mString;
}

int main(int argc, char** argv)
{
    // no memory leak
    while (1==1) {
        std::string *test = new std::string("XXXXXXXXXXXXXXXXXXXXXXXX");
        delete test;
    }

    // LEAK!
    // This causes a memory overflow, because the string thats added
    // to the list is not deleted when the list …
Run Code Online (Sandbox Code Playgroud)

c++ string memory-leaks list

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

C++中的new vs*new

我这样做:

MyClass myObject = *new MyClass();
Run Code Online (Sandbox Code Playgroud)

但是很多人说我应该这样做:

MyClass *myObject = new MyClass();
Run Code Online (Sandbox Code Playgroud)

是否存在性能差异.或者完全使用第二种方法的逻辑原因?我只是喜欢使用第一种方法摆脱指针混淆.

c++ stack pointers dynamic

15
推荐指数
3
解决办法
1659
查看次数

new int [size] vs std :: vector

为了分配动态内存,我一直在C++中使用向量.但是最近,在阅读一些源代码时,我发现使用"new int [size]"并在一些研究中发现它也分配了动态内存.

谁能给我建议哪个更好?我从算法和ICPC的角度来看?

c++ memory vector dynamic

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

C++ 11 std :: thread vs windows CreateThread

哪个选项是在Visual C++创建(和管理)的线程更好的:C++ 11 std::threadWinAPI功能(如CreateThread,_beginthreadex等),为什么?

c++ windows multithreading visual-c++

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

C++:关于内存管理

我对C++有点新,到目前为止一直在用Obj-C和Java编程.

说,我有一节课:

class Person {

private:
   Wife *current_wife;
   //.....
};
Run Code Online (Sandbox Code Playgroud)

所以我需要实现一个setter方法来改变Wife实例变量.

像这样:

Person::SetCurrentWife (Wife *new_wife) {

    current_wife = new_wife;
}
Run Code Online (Sandbox Code Playgroud)

这将是一个副本.

所以从主循环或我调用的东西:

Person *some_person = new Person();
...
Wife *wife = new Wife ();
some_person->SetCurrentWife(wife);
Run Code Online (Sandbox Code Playgroud)

所以我很困惑:这里会有内存泄漏吗?我应该在这里或在Person的析构函数中删除妻子对象吗?在Obj-C中,我会释放当前的妻子,然后向上面的妻子对象发送一条保留消息,但在C++中使用setter方法的正确方法是什么?

c++ memory memory-leaks memory-management

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

构造函数中的内存分配异常

我有一个构造函数,使用new运算符分配几个内存块.

X::X() {
    a = new int[100];
    b = new char[100];
    c = new float[100];
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果分配c失败,并且构造函数抛出异常,将会为内存ab自动被删除?

c++ memory-management

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

如何在矢量被破坏时解除分配内容?

据我所知,对于两个向量声明:

//TYPE 1
std::vector<cls> vec;     //cls is user defined datatype(A class)
Run Code Online (Sandbox Code Playgroud)

向量的内存在堆栈上分配,向量中的内容的内存在堆上分配.

以下声明也是如此(如果我错了,请纠正我):

//TYPE 2
std::vector<cls*> vec;    //cls is user defined datatype(A class)
Run Code Online (Sandbox Code Playgroud)

现在,当Type 1中的向量超出范围时,将为存储在其中的对象释放内存.

但是如果我插入如下的元素(假设我有正确的重载构造函数)然后向量超出范围,那么在类型2中会发生什么:

vec.push_back(new cls(5));
Run Code Online (Sandbox Code Playgroud)

我明确地尝试调用clear但是没有调用析构函数.是否会自动释放内存并调用析构函数.如果不是那么如何实现.

此外,如果我将vector声明为vector,那么为向量分配的内存以及内容:

std::vector<cls*> *vec = new std::vector<cls*>;
Run Code Online (Sandbox Code Playgroud)

c++ stl

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

什么时候使用'new'关键字?

什么时候需要new在Java中使用关键字.我知道你应该在创建像这样的对象的实例时使用它:

TextView textView = new TextView(this);
Run Code Online (Sandbox Code Playgroud)

有时在代码中我注意到new没有使用,我感到困惑..在这行代码中:

    AssetManager assetManager = getAssets();
Run Code Online (Sandbox Code Playgroud)

为什么不像这样创建AssetManager的实例:

AssetManager assetManager = new AssetManager();
Run Code Online (Sandbox Code Playgroud)

那么它被设置为等于getAssests()?

什么时候应该new使用?

谢谢!

java object new-operator

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