为了改写标题,假设我删除了指针 *ptr
,并且只有在我知道它处于打开状态时才想为它分配一些新的东西,我应该用 NULL
还是 nullptr
分配它?如果也许两者都不好,那还有什么更好的方法呢?
根据我的研究,NULL
既可以是 int 类型也可以是指针类型,在执行重载函数时可能会搞砸,而 nullptr
只是一种指针类型。但是,我仍然不知道何时使用哪个。我应该始终对未分配的指针使用 nullptr
吗?如果是这样,NULL
的目的是什么?
(顺便说一句,这是我关于堆栈溢出的第一个问题,所以如果我把它发布在不属于它的地方,请原谅我)
编辑:至于智能指针,我现在不能真正使用它们,因为我可能会被我们的教授责骂。
删除指针时,将释放分配给指针的内存,这些内存是在堆中创建的,即动态的。您无法删除不是由 new
或 new []
创建的任何内容。该名称将保留(除非 {大括号} 强制其过期),您将能够再次使用它,否则将无法使用它。
请考虑以下代码:
int * pointer = new int; // a pointer created;
*pointer = 1;//memory holds the value 1
std::cout << "Value: " << *pointer << ", Location: " << pointer << std::endl;
delete pointer;// pointer's memory is not used by the pointer
pointer = new int;
*pointer = 2;//memory holds the value 2
std::cout << "Value: " << *pointer << ", Location: " << pointer << std::endl;
delete pointer;// pointer's memory is not used by the pointer
位置可以相同,也可以更改(如果在分配之间放置任何其他分配,它们更有可能更改)。这是堆,存储在哪里并不重要。尝试编译它(在 int main(){} 中)
并查看自己在机器上的位置。
当你为指针分配一些东西时,你会告诉他指向哪里。这是不同的。
基本上,分配一个 nullptr
是你需要的,所以它甚至不应该被称为删除。但是,指针可以保持没有任何值指向,除非您尝试删除它。而且因为删除两次会导致未定义的行为,它应该指向某个地方,删除不会带来伤害。
在某些情况下,您创建一个程序,该程序在任何情况下都会删除指针指向的内存,并且不会检查是分配还是删除了内存。(最常见的例子可能是移动语义。因此,空指针始终作为模式的一部分在那里使用。
关于 NULL:
宏在 C 中变得越来越过时,因为它走向自由。它可以带来文物,所以不要弄乱它,让你的生活更轻松。
你根本不应该在 C 中使用 NULL
。如果需要空指针值,请使用空点。
空的目的是什么?
它是从 C 标准库继承的残余。它在 C 中没有任何目的,只是使一些 C 代码有效而无需更改 C - 这曾经是 C 语言设计的重要组成部分,但多年来随着两种语言的分歧而失去了它的重要性。
如果也许两者都不好,那还有什么更好的方法呢?
通常最好确保已删除的指针是其超对象正在被销毁的成员。在这种情况下,无需为指针分配任何值,因为它即将停止存在。有关更多详细信息,请参阅 RAII 习语。
应避免使用裸拥有指针,从而避免直接使用 new
和 delete
。
问题内容: 我知道该ValueEventListener线程在新线程中运行,是否应该在任何时间删除此线程以进行适当的线程管理?(例如,没有太多并行运行的线程)。如果是,该怎么办? 问题答案: 在谈论监听器时,是的,您需要根据活动的生命周期将其删除,为此,您需要使用以下代码行: 请记住,如果不这样做,最终将浪费您的电池和带宽。所以: 如果已在中添加了侦听器,则onStart必须在中将其删除onSto
问题内容: 我正在使用c / c 为osx和linux开发命令行界面可执行文件。该项目将链接到opencv。我应该使用libc 还是libstdc ++? 问题答案: 我会为每个操作系统使用本机库,即GNU / Linux上的libstdc 和Mac OS X上的libc 。 libc 在GNU / Linux上不是100%完整的,而libstdc 更完整时使用libc并没有真正的优势。另外,如果
问题内容: 和CSS 和有什么不一样?我应该使用哪一个?为什么? 问题答案: 所有这些答案似乎都是不正确的。与直觉相反,在CSS 中不是pixel 。至少不是在简单的物理意义上。 从W3C,EM,PX,PT,CM,IN…阅读本文,了解如何为CSS发明一个“神奇的”单元。的含义因硬件和分辨率而异。(该文章是最新的,最新更新为2014-10。) 我自己的思考方式: px单位是CSS的魔术单位。它与当前
问题内容: 我正在一个将Angular和Underscore都作为依赖项的项目。 当我需要创建对象的副本时,根据当时的心情,我可以使用或 在我看来,这些方法中的一种可能比另一种更快速/可靠/健壮。 假设已经包含两个库,那么这两个函数中的任何一个是否存在使另一个函数更好或更坏使用的已知问题? 问题答案: 关于您的问题: angular.copy和_.clone是不同的。这不是哪个更好的问题,而是关于
问题内容: 我想从文本文件中读取每一行并将它们存储在ArrayList中(每一行是ArrayList中的一项)。 到目前为止,我知道BufferedInputStream写入缓冲区,并且仅在缓冲区为空时才进行另一次读取,这可以最大程度地减少或至少减少操作系统的操作量。 我正确吗-我说得通吗? 如果以上情况是在任何情况下,任何人都想使用DataInputStream。最后,我应该使用这两个中的哪一个
问题内容: 假设我们有两个实体,A和B。B与A具有多对一关系,如下所示: 现在,我要删除对象,并将删除操作级联到其所有子项。有两种方法可以做到这一点: 添加到OneToMany批注中,让JPA删除所有子项,然后再从数据库中删除A对象。 保持类不变,只需让数据库级联删除操作即可。 使用后面的选项有什么问题吗?这会导致实体管理器保留对已删除对象的引用吗?我之所以选择选项2而不是选项1的原因是,选项1生
问题内容: 空字符串或空字符串- 在表列中不表示任何数据时,一个字符串比另一个字符串更好吗?(我专门使用MySQL,但我认为这是与系统无关的。)使用一个相对于另一个是否有主要的优点/缺点,还是仅仅是程序员偏爱? 问题答案: 我坚决不同意说无条件使用NULL的每个人。如果将列设置为NOT NULL,则允许列为NULL会引入一个附加状态。如果不需要其他状态,请不要执行此操作。也就是说,如果您无法在空字
问题内容: 在numpy中,可以使用切片语法中的’newaxis’对象创建长度为1的轴,例如: 该文档的状态是一个也可以用代替,效果是完全一样的。 有什么理由选择一个?是否有一般偏好或样式指南?我的印象是更受欢迎,可能是因为它更明确。那么,有什么理由允许这样做? 问题答案: 之所以被允许,是因为它仅仅是的别名。 作者之所以选择它,是因为他们需要一个方便的常量并且可用。 至于为什么你应该更喜欢过:主