上下文:我正在创建一个简单的库。在其中,我正在返回我创建的一个类,我可以,a)在堆栈上声明并期望用户在堆需要时复制到堆,或者b)声明堆,并期望用户在完成对象时delete
。
这些方法中的哪一种是最佳做法,如果没有明确的赢家,应该在哪里使用?我在想我会创建一个.dll
( .so
等等,但如果我创建不同类型的二进制文件,答案会改变吗?如果用户将标题和源复制到他们的项目中并在每次构建项目时构建整个库,会发生什么。会有什么变化?
附注:我想第三个选项是允许参数表示函数返回的对象是否在堆栈上。这看起来真的很复杂,我从来没有见过库/ API这样做。第四种选择是允许指向已经存在的对象的指针,然后用新数据填充该对象。这种方式允许用户指定他们喜欢哪种类型的对象,但它再次看起来相当复杂。
答案 0 :(得分:2)
始终更喜欢自动内存管理。如果需要动态生命周期,仅使用动态内存管理。如果你的函数的目的是返回一个T,那么这里不需要动态生命周期。
如果确实需要动态生命周期,那么就不要处理需要删除的对象的原始指针 - 始终使用智能指针。
此外,
如果用户需要在堆上,则希望用户复制到堆
你的意思是移动到堆中,对吗?