C++ 我可以使用memcpy指向我之前新建的指针吗?;

C++ 我可以使用memcpy指向我之前新建的指针吗?;,c++,pointers,memcpy,C++,Pointers,Memcpy,例如,我尝试编写自己的向量,所以我只编写它的赋值函数,如下所示 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[_ca

例如,我尝试编写自己的
向量
,所以我只编写它的
赋值
函数,如下所示

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);
}
模板
void Vector::assign(T*start,T*end)
{
如果(结束-开始>\u容量)
{
调整大小(结束-开始);
}
_大小=结束-开始;
删除[]ptr;
ptr=新的T[_容量];
memcpy(ptr、start、end-start);
}
我以前有新的指针
ptr
,但我可以复制指针
start
end
之间的所有内容


为什么??非常感谢。

以这种方式重用指针非常好,但是在这里使用memcpy并不安全,因为您不知道t是什么类型。如果T是字符串或向量之类的对象类型,则会导致未定义的行为

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

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

这是安全的C++方式。


希望这有帮助

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

其次,这不是异常安全的。
它甚至没有提供基本的保证,更没有强大的保证

在修改对象之前,需要执行所有异常不安全的工作。这意味着在修改对象之前(当然是在自由之前),必须执行
新的
。否则,您可能会引发错误,使对象处于无效状态(这可能看起来不错,但如果捕获异常并继续,您现在拥有一个包含指向已释放内存的指针的对象该怎么办)

因此,即使您使用了
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

}
模板
void Vector::assign(T*start,T*end)
{
Vector tmp(start,end);//构造一个分配内存的临时对象。
交换(tmp);//交换当前对象和tmp对象数据。
//当tmp对象超出范围时,它将删除
//当前的对象数据是什么
}

仅当
T
是一种普通的可复制类型时。。。(读作:不,不好的主意)看。这并没有提供强大的异常保证。谢谢,我刚刚发现正确的使用方法是
std::copy(start,end,ptr)这不是一个好主意。因为它仍然保留
assign()
方法,不提供异常保证,因此它是一个错误的答案。args到
std::copy
的顺序不正确。它应该是
std::copy(开始、结束、ptr),而不是
标准::复制(ptr,开始,结束)。在C++11中,您可以使用
std::copy\n(开始,大小,ptr)
@LokiAstari-绝对可以。然而,考虑到OP的问题局限于这一行,我决定将我的答案集中在解释为什么memcpy是个坏主意上。将整个函数重写为异常安全会分散对特定教学点的注意力。