我已经用c ++编写了一段时间,当我尝试编译这个简单的代码片段时,我遇到了困难
class A
{
public:
void f() {}
};
int main()
{
{
A a;
a.f(); // works fine
}
{
A *a = new A();
a.f(); // this doesn't
}
}
Run Code Online (Sandbox Code Playgroud) a的std::unique_ptr具体用途是什么,何时以及如何最好地使用?
我发现:
我已经知道了:
std::unique_ptr 是用C++ 11开发的替代品 std::auto_ptrstd::unique_ptr没有引用计数和它所指向的"拥有"对象std::unique_ptrstd::unique_ptr就是结构我想知道的是:
std::unique_ptr更好的(除了唯一性)别的std::unique_ptr利于std::shared_ptr在几乎所有情况下都能满足动态内存管理的需要,为什么我可以处理一std::unique_ptr件事(同样,C++规范说默认析构函数删除所有非静态成员.然而,我无法实现这一目标.
我有这个:
class N {
public:
~N() {
std::cout << "Destroying object of type N";
}
};
class M {
public:
M() {
n = new N;
}
// ~M() { //this should happen by default
// delete n;
// }
private:
N* n;
};
Run Code Online (Sandbox Code Playgroud)
然后这应该打印给定的消息,但它不会:
M* m = new M();
delete m; //this should invoke the default destructor
Run Code Online (Sandbox Code Playgroud) 我有这样的问题:我有课Foo,如果有这个类的一些对象,
Foo a();
Run Code Online (Sandbox Code Playgroud)
我需要把这个对象放到两个不同的向量:
std::vector<Foo> vA, vB;
Run Code Online (Sandbox Code Playgroud)
如果a在改变vA应该改变了vB,载体vA和vB可以不同,但它们可以有相同的对象.我知道可以使用Boost,但我不能使用Boost.
将新对象元素推送到std::vector?的正确方法是什么?我希望数据在向量中分配.这会将对象复制newradio到向量中,然后newradio在超出范围时(例如在堆栈外)摆脱它吗?
vector<Radio> m_radios;
Radio newradio(radioNum);
m_radios.push_back(newradio);
Run Code Online (Sandbox Code Playgroud)
然后当我释放包含的对象时m_radios,这将释放向量分配的所有内存吗?
Objective C引入了一项名为ARC的技术,使开发人员免于内存管理的负担.这听起来不错,我认为如果g ++也有这个功能,C++开发人员会非常高兴.
ARC允许您将内存管理的负担放在(Apple LLVM 3.0)编译器上,从不再考虑保留,释放和自动释放
所以,如果LLVM3.0可以做到这一点,我认为g ++也可以让C++开发人员摆脱内存管理的艰巨任务,对吧?
将ARC引入C++有什么困难吗?
我的意思是:如果我们不使用智能指针,我们只使用new/ new[],编译器是否可以为我们做些什么来防止内存泄漏?例如,自动将新指针更改为智能指针?
就像它已经写在这里 Qt到目前为止有8个特定的智能指针类.它看起来就像你需要的一切.但是,为了使用这些智能指针中的任何一个,您的类必须从QObject派生,这并不总是方便的.在Qt中是否有其他智能指针实现可以与任意类一起使用?
我正在尝试使用智能指针为类成员变量创建一个访问器.这是代码:
class MyResource
{
};
class MyClass
{
public:
std::unique_ptr<MyResource> getResource();
private:
std::unique_ptr<MyResource> resource;
};
std::unique_ptr<MyResource> MyClass::getResource()
{
return this->resource;
}
Run Code Online (Sandbox Code Playgroud)
我试图编译这个错误:
无法访问类'std :: unique_ptr <_Ty>'中声明的私有成员
添加.get到this->resource当然不会,因为返回类型的变化工作.
我不应该在这里使用unique_ptr吗?这只是一个语法问题吗?我完全走错了路吗?
我的智能指针背景: 我已经使用了几年的普通指针,部分原因是因为我找不到何时使用哪种智能指针以及如何使用它们的可靠解释.我已经厌倦了找借口,所以我只是潜入.我想我明白智能指针是什么以及为什么要使用它们,但我对细节知之甚少.目前,我完全迷失在关于智能指针的 无尽 问答中 .
确实delete[] a,在那里a被指针的动态分配的数组,执行delete对于在阵列中的每个指针?
我想,它为具有用户定义类的数组执行析构函数,但是指针发生了什么?
为什么以及何时需要提供自己的删除器?关键字不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) c++ ×10
c++11 ×2
vector ×2
arrays ×1
class ×1
default ×1
destructor ×1
new-operator ×1
pointers ×1
qt ×1
stl ×1
unique-ptr ×1