gpt4 book ai didi

C++ 复制赋值 : why it is not applicable to use it dealing with uninitiated object?

转载 作者:行者123 更新时间:2023-11-28 01:34:03 25 4
gpt4 key购买 nike

我正在阅读 BJARNE STROUSTRUP 的好书:Programming : Principles and Practices using C++ programming。我正在阅读他试图展示如何设计 vector 的部分。然而,一句话捕获了我。 (如果你也在看这本书,我只能告诉你这句话在整本书中的位置,这种可能性不大,所以我不在这里定位。)

"We move an element to the new space by constructing a copy in uninitialized space and then destroying the original. We can’t use assignment because for types such as string, assignment assumes that the target area has been initialized."

为了帮助您了解上下文,我在此处提供了一些代码:

template<typename T, typename A = allocator<T>> class my_vector {
A alloc; // use allocate to handle memory for elements
// . . .
private :
T* elem;
int sz;//short for size
int space;//actually means capacity here.
};

他试图展示如何实现 reserve()。实现在这里:

template<typename T, typename A>
void my_vector<T,A>::reserve(int newalloc)
{
if (newalloc<=space) return; // never decrease allocation
T* p = alloc.allocate(newalloc); // allocate new space
/***/for (int i=0; i<sz; ++i) alloc.construct(&p[i],elem[i]);// copy!!! he means we can't use copy assignment operator here!
for (int i=0; i<sz; ++i) alloc.destroy(&elem[i]); // destroy
alloc.deallocate(elem,space); // deallocate old space
elem = p;
space = newalloc;
}

他的意思是我们只能使用 alloc.construct() 复制构造 elem 而不是使用简单的复制赋值,例如 p[i] = elem [我]。他给出的理由就是我上面引用的。

假设为泛型类型 T 定义了复制赋值(可能使用 Concepts),为什么这里仍然不能使用复制赋值?他说

"such as string, assignment assumes that the target area has been initialized".

然而,我还是不明白。你能帮我理解他的要点吗?我认为即使目标未启动,复制分配也能正常工作,毕竟目标是要启动的目标。

谢谢!

最佳答案

假设你有一个类似的类

struct Foo
{
int * data;
int size
Foo() : data(nullptr), size(0) {}
Foo(const Foo& f) : data(new int[f.size]), size(f.size)
{
std::copy(f.data, f.data + f.size, data);
}
Foo& operator=(const Foo& f)
{
if (&f == this)
return *this;
else
{
if (size < f.size)
//allocate new space
// copy
}
}
};

现在,如果我们替换

for (int i=0; i<sz; ++i) alloc.construct(&p[i],elem[i]);

for (int i=0; i<sz; ++i) p[i] = elem[i];

这行不通。 p[i]指的是 Foo那从未被 build 过。如果它的成员已经被设置,这意味着没有,这意味着当我们做 if (size < f.size)我们正在访问一个未初始化的变量,这是未定义的行为。

这就是我们制作拷贝(或在 C++11 及更高版本中移动)的原因。它保证对象被构建并且“正确的事情”发生。

关于C++ 复制赋值 : why it is not applicable to use it dealing with uninitiated object?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50156943/

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