gpt4 book ai didi

visual-studio-2008 - VC2008中的自动指针构造函数

转载 作者:行者123 更新时间:2023-12-04 17:21:34 31 4
gpt4 key购买 nike

我有一个自动指针实现:

template <typename T, bool Arr = false>
class GAutoPtr
{
T *Ptr;

public:
typedef GAutoPtr<T, Arr> &AutoPtrRef;

GAutoPtr(T *ptr = 0)
{
Ptr = ptr;
}

GAutoPtr(AutoPtrRef p)
{
Ptr = p.Release();
}

~GAutoPtr() { Empty(); }
operator T*() { return Ptr; }
T *Get() { return Ptr; }
T *operator->() const { LgiAssert(Ptr); return Ptr; }

inline void Empty()
{
if (Arr)
delete [] Ptr;
else
delete Ptr;
Ptr = 0;
}

AutoPtrRef operator =(GAutoPtr<T> p)
{
Empty();
Ptr = p.Ptr;
p.Ptr = 0;
return *this;
}

void Reset(T *p)
{
if (p != Ptr)
{
Empty();
Ptr = p;
}
}

T *Release()
{
T *p = Ptr;
Ptr = 0;
return p;
}
};

typedef GAutoPtr<char, true> GAutoString;
typedef GAutoPtr<char16, true> GAutoWString;

这在 Visual C++ 6 中运行良好。但是在 Visual C++ 2005 或 2008 中,我无法从函数返回自动指针而不会出现可怕的错误。

例如

GAutoString Func()
{
char *s = new char[4];
strcpy(s, "asd");
return s;
}

int main()
{
GAutoString a = Func();
/// a.Ptr is now garbage
}

编译器会创建一个临时 GAutoString 来保存函数的返回值,然后在将其传递给堆栈上的变量“a”时调用临时变量的运算符 T*(),然后GAutoPtr(T *ptr = 0) 构造函数,而不是仅仅使用复制构造函数: GAutoPtr(AutoPtrRef p)

这会导致 temp auto ptr 删除内存,并且 'a' 持有指向已释放内存的指针。

但是在 VC6 中它确实调用了正确的构造函数。综上所述,我还在 Linux 和 Mac 上使用 gcc,因此我编写的任何代码也都需要在那里工作。 VC2008 阻止您在复制构造函数中使用非 const 按值变量。此外,无论如何我都不想要“const”,因为复制构造函数获取内存块的所有权,这会从正在复制的对象中删除所有权......从而修改它。

我怎样才能在 VC 2005/2008 中完成这项工作?

最佳答案

这是否甚至在最近的 g++ 下编译?我在我的 MacBook Pro 上试过了:

xxx.cpp: In function ‘AutoString func()’:
xxx.cpp:52: error: no matching function for call to ‘AutoPtr<char, true>::AutoPtr(AutoString)’
xxx.cpp:12: note: candidates are: AutoPtr<T, isArray>::AutoPtr(AutoPtr<T, isArray>&) [with T = char, bool isArray = true]
xxx.cpp:9: note: AutoPtr<T, isArray>::AutoPtr(T*) [with T = char, bool isArray = true]
xxx.cpp:52: error: initializing temporary from result of ‘AutoPtr<T, isArray>::AutoPtr(T*) [with T = char, bool isArray = true]’

我可以让它编译的唯一方法是让复制构造函数采用 const 引用,这正是我所怀疑的。看起来像 Herb Sutter posted about something very similar在他最近的 GotW 中对此进行了说明。如果没有很好的理由,我不会尝试复制 std::auto_ptr 的所有权转移语义。您可能想看看 Boost.SmartPtr 中的各种好东西.如果可能,请改用它们。

如果您出于某种原因无法提升,请阅读您最喜欢的 std::auto_ptr 实现并特别注意 std::auto_ptr_ref 类。一旦你理解了它为什么在那里以及它究竟是如何做的,然后回过头来写一个 auto-ptr 类。此类的存在是为了解决您所看到的问题。 IIRC,这在 Josuttis': The Standard C++ Library 中有详细讨论。 .我想那是我第一次真正理解它的地方。

关于visual-studio-2008 - VC2008中的自动指针构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/745925/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com