小编pur*_*uck的帖子

如何实现std :: tr1 :: shared_ptr?

我一直在考虑使用共享指针,我知道如何自己实现它 - 不想这样做,所以我在尝试std::tr1::shared_ptr,我有几个问题......

引用计数是如何实现的?它是否使用双向链表?(顺便说一句,我已经用Google搜索了,但我找不到任何可靠的东西.)

使用它有任何陷阱std::tr1::shared_ptr吗?

c++ tr1 shared-ptr

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

为什么static_cast(*this)到基类创建临时副本?

我正在阅读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(上面的代码)创建一个新副本?为什么不只是使用对象的基类部分?

c++ casting effective-c++

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

双删除会发生什么?

Obj *op = new Obj;
Obj *op2 = op;
delete op;
delete op2; // What happens here?
Run Code Online (Sandbox Code Playgroud)

当你意外地双重删除时,最糟糕的情况是什么?有关系吗?编译器会抛出错误吗?

c++ pointers memory-leaks

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

Java引用和C++引用之间有什么区别

所以我一直在想(在阅读这篇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++中的含义是否相同?

c++ java pointers reference

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

我的基类中有一个虚拟析构函数和一个数组.我怎样才能使它工作?

例如:

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)

我的基类中有一个虚拟析构函数和一个数组.如果派生类析构函数覆盖基类析构函数,则不会删除基类.什么是一个很好的解决方案?

c++ virtual-destructor

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

当我修改复制构造函数做一些奇怪的事情,然后通过值将一个(该类的)对象传递给函数时会发生什么?

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.当我将类的对象传递给函数时会发生什么?

编辑:在程序中看起来似乎很棘手......

c++ pass-by-value

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

我如何做这样的事情some_function({1,1,1,1})?

让我说我有一个像这样的原型函数:int func(int * a),它接受一个数组作为参数.

如果没有编译器在任何地方显示错误,我该怎么做:func({1,1,1,1})

c++ arrays

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