unique_ptr<char[]> confusion
unique_ptr<char[]> confusion
我有一个类,我希望其中一个函数将一个唯一的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所需的正确大小,并在数据本身上进行复制?
我知道当不再引用对象,但对基元变量仍然相同时,会自动调用析构函数吗?
析构函数总是在逻辑上调用的。然而,由于像int
和char
这样的东西是微不足道的可破坏性的,编译器知道实际上不应该调用任何东西。
例如,如果我这样做,内存会被删除吗?
是的——std::unique_ptr<T>
的全部意义在于你的记忆会自动得到处理。
A(std::unique_ptr<char[]> data) {
internaldata = data;
}
该示例无法编译,因为internaldata = data
正在调用复制赋值运算符,并且不允许复制std::unique_ptr
实例(因此为唯一位(。
在这个过程中,引用计数到底发生了什么?是否会发生重新分配、复制和删除?
没有引用计数——std::unique_ptr
要么引用某个内容,要么为空。当您从std::unique_ptr
中std::move
时,移动的from变量变为空。如果您正在查找引用计数的指针类型,请参阅std::shared_ptr<T>
。
最后,在减速过程中是否可以将数据传递到智能指针?
否。对于std::make_unique<T[]>
,只允许传递一个std::size_t
(请参阅重载2(。为您要查找的内容编写包装器函数应该很容易。
- Confusion: decltype vs std::function
- EASTL矢量<向量<int>>连续的
- unique_ptr<char[]> confusion
- C++ Classes/Confusion
- C++ ifstream::read confusion
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- C 字符串比较“祝您好运”&gt;“再见”
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- C 操作员&gt;&gt;与突变器过载
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 是否需要使用 - &gt;运算符在C 中调用成员函数时
- 什么是模板&lt;&gt;inline bla bla
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- eigen :: llt&lt;eigen :: matrixxd&gt;具有不完整的类型
- 错误,包括&lt; ctype&gt;在原子上使用C 11
- 错误c++visual studio c2227左侧'->;Init';必须指向类/结构/联合/泛型类型
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- ``这个''不能用this-&gt;指针变量
- 如何加入向量&lt; int&gt;到C 中的单个INT