Here's a notable video (Stop teaching C) about that paradigm change to take in teaching the c++ language.
还有一篇值得注意的博文
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
直接(当然除了实现这样的容器/智能指针类)?
有时传言(如 here 或 here )使用 new
和 delete
在某些情况下,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();
我对有效的“每天”用例特别感兴趣,而学术/教育目的要求和限制并未包含在上述标准中设施。
那new
和 delete
可用于内存管理/垃圾收集器框架或标准容器实现是不可能的1。
一个主要动机......
...问这个问题是提供一种替代方法,而不是任何(家庭作业)问题,这些问题仅限于使用标题中提到的任何构造,但是关于生产就绪代码的严肃问题。
这些通常被称为内存管理的基础,这是 IMO 公然错误/误解为适合初学者讲座和任务。
1)补充:关于那段,这应该是一个明确的指示,new
和 delete
不适合初学者 c++ 学生,但应该留给更高级的类(class)。
最佳答案
所有权不应该是本地的。
例如,指针容器可能不希望对其中指针的所有权驻留在指针本身中。如果您尝试编写具有前向唯一 ptrs 的链表,则在销毁时您可以轻松炸毁堆栈。
类似 vector
的拥有指针的容器可能更适合在容器或子容器级别而不是元素级别存储删除操作。
在这些和类似的情况下,您可以像智能指针一样包装所有权,但您是在更高级别上进行的。许多数据结构(图等)可能存在类似问题,所有权正确地驻留在比指针所在位置更高的位置,并且它们可能不会直接映射到现有容器概念。
在某些情况下,将容器所有权从数据结构的其余部分中分离出来可能很容易。在其他情况下可能不会。
有时您的非本地非引用计数生命周期非常复杂。在这些情况下,没有理智的地方可以放置所有权指针。
在这里确定正确性很难,但并非不可能。存在正确且具有如此复杂的所有权语义的程序。
所有这些都是极端情况,很少有程序员会在职业生涯中遇到几次以上的情况。
关于c++ - 是否有任何有效的用例可以在现代 C++ 中使用 new 和 delete、原始指针或 c 样式数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46991224/