每日一题

class Solution {
public:
ListNode* trainingPlan(ListNode* head, int cnt) {
int leng = 0;
ListNode* p = head;
while(p){
leng++;
p = p->next;
}
for(int i = 0;i < leng - cnt;i++){
head = head -> next;
}
return head;
}
};
八股
new或malloc在申请空间时,超出可申请的大小就会分配异常,可申请的大小是多少
在 C++ 中,new 和 C 语言中的 malloc 都用于动态内存分配。它们会尝试从操作系统请求一块内存空间。如果超出操作系统允许的最大内存空间,分配操作会失败,返回 nullptr(对于 new 是 nullptr,对于 malloc 是 NULL)。
在 32 位系统中,进程最大可访问的内存通常为 2 GB 或 4 GB(具体取决于操作系统和硬件),而在 64 位系统中,理论上可以申请几 TB 的内存(实际上,操作系统和硬件也有自己的限制)。
C++循环引用指的是什么,在使用过程当中需要注意什么问题
循环引用通常指的是两者(或更多对象)之间通过指针或引用的方式互相引用,从而形成一个闭环或环形依赖。这种依赖关系常见于对象之间通过指针(或智能指针)互相引用的场景。
循环引用可能导致的问题:
-
内存泄漏: 循环引用最常见的问题是内存泄漏。假设你使用
new来动态分配A和B对象,并且A和B互相引用对方。即使你明确调用了delete释放内存,两个对象仍然持有彼此的指针,导致它们的引用计数永远不会归零,从而无法释放内存。 -
智能指针引起的内存泄漏: 使用
std::shared_ptr时,如果两个对象互相持有shared_ptr,它们的引用计数不会降为零,导致内存无法释放。
如何避免和解决循环引用:
-
使用
std::weak_ptr:std::weak_ptr是一种智能指针,它不会增加引用计数,因此可以用来打破循环引用。通常,如果两个对象互相引用,而你希望避免循环引用,可以让其中一个对象持有std::weak_ptr而不是std::shared_ptr。 -
避免过度依赖互相引用: 尽量避免让两个对象互相依赖,尤其是在设计阶段。设计时可以考虑使用其他设计模式(例如观察者模式、委托模式等),从而减少直接的相互引用。
-
手动管理内存: 如果没有使用智能指针,可以使用原始指针时小心内存管理,确保在销毁对象时手动处理引用关系,避免出现指针引用死锁或者循环引用的问题。这通常需要实现自己的内存管理逻辑,或者确保在删除对象时避免发生引用丢失。
2511

被折叠的 条评论
为什么被折叠?



