unique_ptr<char[]> confusion

unique_ptr<char[]> confusion

本文关键字:gt confusion char lt unique ptr      更新时间:2023-10-16

我有一个类,我希望其中一个函数将一个唯一的ptr对象传递给char数组。但我对独特指针的几个特性感到困惑。我知道当不再引用对象时,会自动调用析构函数,但对于基元变量仍然是一样的吗?例如,如果我这样做,内存会被删除吗?

class A {
private:
public:
A(std::unique_ptr<char[]> data) {
data = nullptr;
}
~A();
};
int main() {
auto data = std::make_unique<char[]>(10);
A a(std::move(data));
return 0;
}

我的下一个问题是:如果我有一个想要指向数据的私有对象,为什么会导致编译器错误?

class A {
private:
std::unique_ptr<char[]> internaldata;
public:
A(std::unique_ptr<char[]> data) {
internaldata = data;
}
~A() {
internaldata = nullptr;
}
};
int main() {
auto data = std::make_unique<char[]>(10);
A a(std::move(data));
return 0;
}

然而,当我在分配std::move时调用它时,代码编译得很好。

class A {
private:
std::unique_ptr<char[]> internaldata;
public:
A(std::unique_ptr<char[]> data) {
internaldata = std::move(data);
}
~A() {
internaldata = nullptr;
}
};
int main() {
auto data = std::make_unique<char[]>(10);
A a(std::move(data));
return 0;
}

但为什么我必须在这里打两次std::move?一次用于传递参数,第二次用于赋值?在这个过程中,引用计数到底发生了什么?是否发生了重新分配、复制和删除?

最后,在减速过程中,有可能将数据传递到智能指针中吗?因为目前我是这样做的:

auto data = std::make_unique<char[]>(10);
char* buf = data.get();
strcpy(buf, "hello");

但是,有可能做一些类似的事情吗

char hellobuffer[] = "hello";
auto data = std::make_unique<char[]>(hellobuffer);

在哪里,数据会自动分配存储hellobauffer所需的正确大小,并在数据本身上进行复制?

我知道当不再引用对象,但对基元变量仍然相同时,会自动调用析构函数吗?

析构函数总是在逻辑上调用的。然而,由于像intchar这样的东西是微不足道的可破坏性的,编译器知道实际上不应该调用任何东西。

例如,如果我这样做,内存会被删除吗?

是的——std::unique_ptr<T>的全部意义在于你的记忆会自动得到处理。

A(std::unique_ptr<char[]> data) {
internaldata = data;
}

该示例无法编译,因为internaldata = data正在调用复制赋值运算符,并且不允许复制std::unique_ptr实例(因此为唯一位(。

在这个过程中,引用计数到底发生了什么?是否会发生重新分配、复制和删除?

没有引用计数——std::unique_ptr要么引用某个内容,要么为空。当您从std::unique_ptrstd::move时,移动的from变量变为空。如果您正在查找引用计数的指针类型,请参阅std::shared_ptr<T>

最后,在减速过程中是否可以将数据传递到智能指针?

否。对于std::make_unique<T[]>,只允许传递一个std::size_t(请参阅重载2(。为您要查找的内容编写包装器函数应该很容易。