Rem*_*eau 6
指针在 C++ 中的工作方式与在 Pascal 中的工作方式完全相同。唯一的区别在于您如何分配和释放所指向的事物。
例如,您可以声明一个局部变量并指向它,例如:
int i = 12345;
int *p = &i;
// use p as needed...
这相当于在 Pascal 中:
var
i: Integer;
p: ^Integer;
begin
i := 12345;
p := @i;
// use p as needed...
end;
或者,您可以使用new
和delete
来处理动态分配的变量,例如:
someType *data = new someType;
// use data as needed ...
delete data;
这相当于在 Pascal 中:
type
someType = record
...
end;
var
data: ^someType;
begin
New(data);
// use data as needed ...
Dispose(data);
end;
但是,现代 C++ 代码应尽量避免直接使用new
/ delete
。使用智能指针代替(std::unique_ptr
and std::shared_ptr
、viastd::make_unique()
和std::make_shared()
),当它们超出范围并被销毁时会自动释放内存。这有助于使代码更安全,并且在指向数据的所有权语义方面更具自文档性。仅在需要访问数据而不转移所有权的情况下使用原始指针,例如:
void doSomething(someType *data)
{
// use data as needed ...
}
{
auto data = std::make_unique<someType>();
doSomething(data.get());
} // <-- data is freed automatically here!
您描述的类的类型更正式地称为“链表”的节点/元素,通常使用new
/实现delete
,例如:
#include <iostream>
struct node
{
int data;
node* next = nullptr;
};
node *head = nullptr;
node *tail = nullptr;
void addToList(int data)
{
node **n = (tail) ? &(tail->next) : &head;
*n = new node{data};
tail = *n;
}
void clearList()
{
node *n = head;
while (n) {
node *next = n->next;
delete n;
n = next;
}
head = tail = nullptr;
}
void printList()
{
node *n = head;
if (n)
{
std::cout << n->data;
while ((n = n->next) != nullptr) {
std::cout << ", " << n->data;
}
}
std::cout << std::endl;
}
int main()
{
addToList(12345);
addToList(67890);
printList();
clearList();
return 0;
}
但是,链表并不是使用智能指针的好例子。是的,head
指针至少可以是智能指针。但是,你仍然要迭代列表摧毁各个节点,在之前unique_ptr
破坏了head
节点。您可能也想使next
指针成为智能指针,但这样做是个坏主意,因为在销毁大型链表时,递归析构函数调用可能会炸毁调用堆栈。迭代循环更适合销毁链表,而next
成为智能指针并不适合该用例。
但是,在任何情况下,C ++内置了标准类双链表(std::list
)和单链表(std::forward_list
),其处理链接指向你,这样你就可以更专注于您的类数据,减少对如何类实例链接在一起,例如:
#include <iostream>
#include <list>
std::list<int> l;
void printList()
{
auto iter = l.begin();
if (iter != l.end())
{
std::cout << *iter;
while (++iter != l.end()) {
std::cout << ", " << *iter;
}
}
std::cout << std::endl;
}
int main()
{
l.push_back(12345);
l.push_back(67890);
printList();
return 0;
}
更多推荐
链接,CPP
发布评论