我可以将memcpy用于我之前新建的指针吗?

时间:2012-06-08 16:43:40

标签: c++ pointers memcpy

例如,我尝试编写自己的vector,所以我只是写这样的assign函数

template <typename T>
void Vector<T> :: assign(T *start, T *end)
{
    if (end - start > _capacity)
    {
        resize(end - start);
    }
    _size = end - start;
    delete []ptr;
    ptr = new T[_capacity];
    memcpy(ptr, start, end - start);
}

我之前有新的指针ptr,但我可以复制指针startend之间的所有内容

为什么呢?非常感谢你。

2 个答案:

答案 0 :(得分:4)

第一个问题是这只适用于简单类型(读取POD) 任何带有构造函数/析构函数的东西都需要调用它们。

其次,这不是例外安全 它甚至没有提供基本的保证让一个人有力的保证。

在修改对象之前,您需要执行所有异常不安全工作。这意味着new必须在之前完成修改对象(并且肯定在免费之前)。否则你可能会抛弃对象处于无效状态(这可能看起来不是很糟糕,但是如果你捕获异常并继续你现在有一个包含指向已释放内存的指针的对象,那该怎么办)。

所以即使你使用std::copy(),你仍然做错了。
我个人认为std :: copy()的建议是一个红鲱鱼。它会正确复制数据,但您仍在严格编写方法。你需要在副本上使用扭曲并交换idium。

template <typename T>
void Vector<T> :: assign(T *start, T *end)
{
    Vector<T> tmp(start, end);  // construct a temp object that allocates the memory.



    swap(tmp);                  // Swap the current object and the tmp objects data.
                                // When the tmp object goes out of scope it will delete
                                // what was the current objects data

}

答案 1 :(得分:3)

以这种方式重用指针是完全没问题的,但是在这里使用memcpy是 是安全的,因为你不知道T是什么类型。如果T是像字符串或向量这样的对象类型,则会导致未定义的行为。

要解决此问题,请将行更改为

std::copy(start, end, ptr);

这是安全的C ++方式。

希望这有帮助!