乍一看,我看不到任何与指针相关的问题。虽然我更喜欢使用引用,并创建merge
一个成员函数,VectorPQueue
所以我不必传递第一个参数(正如其他人已经指出的那样)。让我感到困惑的另一件事是检查- 如果为空one->size() != 0
会有什么问题?one
下面的代码仍然可以正确插入two
,one
因为它仅取决于two
的大小。
关于删除two
:
那将是客户的任务,而不是实施者
好吧,这取决于你想如何设计你的界面。但由于该函数只将two
' 元素添加到one
,我会说它不应该删除它。顺便说一句,我认为这种方法的更好名称将是addAllFrom()
或类似的名称。
关于一般指针:
我强烈建议你看看智能指针。这些是 C++ 中用于减少内存管理工作的常用技术。使用裸指针并通过 new/delete 手动管理它们非常容易出错,很难保证异常安全,几乎可以保证你的内存泄漏等。另一方面,智能指针一旦不包含指针就会自动删除它们需要更多。出于说明目的,C++ 标准库具有auto_ptr
(unique_ptr
并且shared_ptr
如果您的编译器支持 C++ 11)。它是这样使用的:
{ // Beginning of scope
std::auto_ptr<PQueue> one(PQueue::createPQueue(PQueue::UnsortedVector));
// Do some work with one...:
one->someFunction();
// ...
} // End of scope - one will automatically be deleted
我个人的经验法则:只使用包裹在智能指针中的指针。只使用堆分配的对象,如果:
- 它们的寿命必须比创建它们的范围更长,而且复制成本太高(幸运的是,C++ 11 具有移动语义,消除了很多此类情况)
- 我必须在它们上调用虚函数
在所有其他情况下,我尝试尽可能多地使用堆栈分配的对象和 STL 容器。
如果您从 C++ 开始,所有这些一开始可能看起来很多,并且在您冒险使用智能指针等之前尝试完全理解指针是完全可以的(甚至可能是必要的)。但是它可以节省大量的调试时间上。我还建议阅读几本关于 C++ 的书——实际上,在我阅读第一本书之前,我一直以为我理解了 C++ 的大部分内容:)