c++ - 是否有任何有效的用例可以在现代 C++ 中使用 new 和 delete、原始指针或 c 样式数组?

标签 c++ c++11

Here's a notable video (Stop teaching C) about that paradigm change to take in teaching the c++ language.

还有一篇值得注意的博文

I have a dream ...

I'm dreaming of so called C++ courses/classes/curriculae will stop teaching (requiring) their students to use: ...

由于 C++11 作为既定标准,我们有 Dynamic memory management设施又名智能指针
即使从早期的标准我们也有 c++ 标准 Containers library作为原始数组(使用 new T[] 分配)的良好替代品(特别是使用 std::string 而不是 c 样式的 NUL 终止字符数组)。

粗体中的问题:

搁置展示位置new覆盖,是否有任何使用智能指针或标准容器无法实现但只能使用 new 的有效用例?和 delete直接(当然除了实现这样的容器/智能指针类)?

有时传言(如 herehere )使用 newdelete在某些情况下,handrolled 可能会“更有效”这些实际上是什么?这些边缘情况不需要像标准容器或智能指针一样跟踪分配吗?

对于原始 c 风格的固定大小数组几乎相同:有 std::array如今,它允许各种分配、复制、引用等,并且正如每个人所期望的那样容易且语法一致。 有什么用例可以选择T myArray[N];优先于 std::array<T,N> myArray; 的 c 样式数组?


关于与第 3 方库的交互:

假设第 3 方库返回分配有 new 的原始指针喜欢

MyType* LibApi::CreateNewType() {
    return new MyType(someParams);
}

你总是可以将它包装成一个智能指针以确保 delete被称为:

std::unique_ptr<MyType> foo = LibApi::CreateNewType();

即使 API 要求您调用他们的旧函数来释放资源,例如

void LibApi::FreeMyType(MyType* foo);

你仍然可以提供删除功能:

std::unique_ptr<MyType, LibApi::FreeMyType> foo = LibApi::CreateNewType();

我对有效的“每天”用例特别感兴趣,而学术/教育目的要求和限制并未包含在上述标准中设施。
newdelete可用于内存管理/垃圾收集器框架或标准容器实现是不可能的1


一个主要动机......

...问这个问题是提供一种替代方法,而不是任何(家庭作业)问题,这些问题仅限于使用标题中提到的任何构造,但是关于生产就绪代码的严肃问题。

这些通常被称为内存管理的基础,这是 IMO 公然错误/误解为适合初学者讲座和任务。


1)补充:关于那段,这应该是一个明确的指示,newdelete不适合初学者 c++ 学生,但应该留给更高级的类(class)。

最佳答案

所有权不应该是本地的。

例如,指针容器可能不希望对其中指针的所有权驻留在指针本身中。如果您尝试编写具有前向唯一 ptrs 的链表,则在销毁时您可以轻松炸毁堆栈。

类似 vector 的拥有指针的容器可能更适合在容器或子容器级别而不是元素级别存储删除操作。

在这些和类似的情况下,您可以像智能指针一样包装所有权,但您是在更高级别上进行的。许多数据结构(图等)可能存在类似问题,所有权正确地驻留在比指针所在位置更高的位置,并且它们可能不会直接映射到现有容器概念。

在某些情况下,将容器所有权从数据结构的其余部分中分离出来可能很容易。在其他情况下可能不会。

有时您的非本地非引用计数生命周期非常复杂。在这些情况下,没有理智的地方可以放置所有权指针。

在这里确定正确性很难,但并非不可能。存在正确且具有如此复杂的所有权语义的程序。


所有这些都是极端情况,很少有程序员会在职业生涯中遇到几次以上的情况。

关于c++ - 是否有任何有效的用例可以在现代 C++ 中使用 new 和 delete、原始指针或 c 样式数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46991224/

相关文章:

c++ - C++ 错误消息 "<near match>"是什么意思?

c++ - 如何零终止键盘输入?

c++ - std::bind 一个成员函数到 nullptr 处的一个实例导致看似随机的 this 指针

C++:使用int vs struct对静态成员变量进行依赖初始化的静态

c++ - 如何在 LUA 中创建 C++ 兼容函数对象?

recursion - 用于打印参数包内容的递归可变参数模板

c++ - cudaTextureObject_t texFetch1D 不编译

c++ - 获取应用程序 Windows 的完整目录

C++自动推导返回类型

c++ - 运算符 [ ] (std::vector) 不匹配