放置新问题!

时间:2009-07-23 05:22:33

标签: c++ constructor new-operator

我在将我的引用计数指针<Type>类的实例放入我的Array类时遇到问题。使用调试器,似乎永远不会调用构造函数(这会弄乱引用计数并导致段错误!)

我的push_back功能是:

void push_back(const T& element)
{
    if (length >= max)
        reallocate(max > 0 ? max * 2 : 1);

    new (&data[length]) T(element);
    ++length;
}

引用计数与new之后的引用计数相同。我很确定这是问题,但我无法弄清楚为什么不会调用构造函数。另外,Pointer :: Pointer(...)编译是否需要指针<T>&amp;或const指针<T>&amp; (嗯?),并且也有问题!

也许有一些关于展示位置的详细信息我没有考虑到。如果有人有一些想法,他们会非常感激!

编辑:[根据要求,指针的相关摘录]

// ...
private:
    T* p;

public:
    //! Constructor
    Pointer()
        : p(0)
    {

    }

    //! Copy Constructor
    template<class X> Pointer(Pointer<X>& other)
        : p(other.getPointer())
    {
        if (p)
            p->incrementRef();
    }

    //! Constructor (sets and increments p)
    Pointer(T* p)
        : p(p)
    {
        if (p)
            p->incrementRef();
    }

    //! Destructor (decrements p)
    ~Pointer()
    {
        if (p)
            p->decrementRef();
    }
// ...

我还为指针<T>&amp;实现了operator =和T*,以及运营商 - &gt;和运算符T*

3 个答案:

答案 0 :(得分:2)

根据docs构造函数应该被调用...你可以检查几件事:

测试指针:

Pointer<int> p1(new int);
Pointer<int> p2(p1); // Does this call constructor properly?

测试数组:

Array<std::string> array;
std::string str("bla");
array.push_back(str); // Does this call string's constructor

那是失败的,对吧?

Array<Pointer<int> > array;
Pointer<int> p1(new int);
array.push_back(p1);

如果所有其他方法都失败了,您可以随时执行此操作以确保调用复制构造函数或operator =

T* t = new (&data[length]) T();
*t = element;

答案 1 :(得分:2)

您的评论和代码不同步:

//! Copy Constructor
template<class X> Pointer(Pointer<X>& other)

从类模板生成的构造函数不是复制构造函数(在12.8 [class.copy]中有一个脚注说明了这一点),因此不会阻止编译器生成复制构造函数。这个生成的构造函数将更好地匹配标准副本,因为非模板函数比重载解析中的模板函数更受欢迎。

您似乎需要在指针类中编写显式复制构造函数以获得所需的效果。

答案 2 :(得分:0)

请在此发布您的Pointer课程。 我觉得这堂课的T是指针吗? 如果代码应该这样做: new(&amp; data [length])指针(元素);

我很难理解......

为什么不这样做: data [length] = element; 我假设数据[长度]是指针