我一直在考虑使用共享指针,我知道如何自己实现它 - 不想这样做,所以我在尝试std::tr1::shared_ptr
,我有几个问题......
引用计数是如何实现的?它是否使用双向链表?(顺便说一句,我已经用Google搜索了,但我找不到任何可靠的东西.)
使用它有任何陷阱std::tr1::shared_ptr
吗?
我正在阅读Effective C++并遇到了这个例子:
class Window { // base class
public:
virtual void onResize() { ... } // base onResize impl
...
};
class SpecialWindow: public Window { // derived class
public:
virtual void onResize() { // derived onResize impl;
static_cast<Window>(*this).onResize(); // cast *this to Window,
// then call its onResize;
// this doesn't work!
... // do SpecialWindow-
} // specific stuff
...
};
Run Code Online (Sandbox Code Playgroud)
这本书说:
您可能没想到的是它不会在当前对象上调用该函数!相反,强制转换创建了*this的基类部分的新临时副本,然后在副本上调用onResize!
为什么static_cast(上面的代码)创建一个新副本?为什么不只是使用对象的基类部分?
Obj *op = new Obj;
Obj *op2 = op;
delete op;
delete op2; // What happens here?
Run Code Online (Sandbox Code Playgroud)
当你意外地双重删除时,最糟糕的情况是什么?有关系吗?编译器会抛出错误吗?
所以我一直在想(在阅读这篇Java pdf时)......
我知道这可能看起来很愚蠢,但为什么我不能在c ++中这样做.
float &f = new float;
Run Code Online (Sandbox Code Playgroud)
这不是说f的引用是新浮点数的地址吗?
在Java中,我看到类似的东西
String s = new String("something")
Run Code Online (Sandbox Code Playgroud)
String s
被称为字符串引用.
Java中的"引用"一词与C++中的含义是否相同?
例如:
class base
{
public:
base()
{
// allocate memory for basearray
}
virtual ~base()
{
// delete basearray
}
protected:
float* basearray;
};
class derived1 : public base
{
public:
derived1()
{
// allocate memory for derivedarray
}
~derived1()
{
// delete derived array
}
protect:
float* derivedarray;
};
void main()
{
derived1 d;
...
base* pb = &d;
...
// Delete base array?
}
Run Code Online (Sandbox Code Playgroud)
我的基类中有一个虚拟析构函数和一个数组.如果派生类析构函数覆盖基类析构函数,则不会删除基类.什么是一个很好的解决方案?
class C
{
public:
C(C& c)
{
i = c.i;
j = 100;
}
C() : i(0), j(0)
{
}
int i, j;
};
C func(C c)
{
return c;
}
int main()
{
C c;
c = func(c)
// What is the value of j?
}
Run Code Online (Sandbox Code Playgroud)
上面是一个具有不寻常的复制构造函数的类.它不是复制i和j,而是复制i并将其他东西分配给j.当我将类的对象传递给函数时会发生什么?
编辑:在程序中看起来似乎很棘手......
让我说我有一个像这样的原型函数:int func(int * a)
,它接受一个数组作为参数.
如果没有编译器在任何地方显示错误,我该怎么做:func({1,1,1,1})
c++ ×7
pointers ×2
arrays ×1
casting ×1
java ×1
memory-leaks ×1
reference ×1
shared-ptr ×1
tr1 ×1