用户定义的链表从函数返回指针
User defined linked list returning pointer from function
我知道不久前我问了一个类似的问题,但仍然不起作用。很抱歉重复,我只是不确定为什么它不起作用。我创建了自己的链表(不使用stl库),我已经设置好了我的类,并按照我想要的方式完美地工作。我遇到的问题是,当我使用一个函数来填充列表时,会得到一个引用。在我的main中,我调用用于填充列表的函数bookSetUp()
。我使this函数等于一个临时指针。(这是代码)
Main.cpp
Book* temp = bookSetUp();
while(temp!=NULL)
{
cout<<temp->getName()<<endl;
cout<<temp->getAuthor()<<endl;
cout<<temp->getISBN()<<endl;
temp = temp->getNext();
}
bookSetUp()位于另一个名为functions.cpp的.cpp文件中(我已经测试了这两个.cpp之间的链接)
函数.cppBook* bookSetUp()
{
//The items that populate the list
Book a("A Tale of Two Cities", "Charles Dickens", 1203456, true);
Book b("Lord of the rings", "J.R.R Tolkein", 123456, true);
Book c("Le Petit Prince", "Antoine de Saint-Exupéry", 123457, true);
Book d("And Then There Were None", "Agatha Christie", 123458, true);
Book e("Dream of the Red Chamber","Cao Xueqin",123459, true);
Book f("The Hobbit","J.R.R Tolkein",123467, true);
a.setPrev(NULL);
a.setNext(&b);
b.setPrev(&a);
b.setNext(&c);
c.setPrev(&b);
c.setNext(&d);
d.setPrev(&c);
d.setNext(&e);
e.setPrev(&d);
e.setNext(&f);
f.setPrev(&e);
f.setNext(NULL);
Book* temp = &a;
return temp;
}
正如你所看到的,我试图返回一个指向列表中第一个项目的指针,以便main可以访问它。我的book类有属性:字符串名称、字符串作者、int isbn和bool可用性
该程序崩溃,出现"bookRepository.exe中0x00B16886处的未处理异常:0xC0000005:读取位置0xCCCCCD04的访问冲突。"这意味着它没有从bookSetUp()函数中获取值
同样在调试器中,int ISBN返回,但不返回字符串或布尔
有人知道为什么不起作用吗?如果可以的话,这将是一个巨大的帮助!
这是新手的一个常见误解,他们并不真正理解指针应该如何使用。
一步一个脚印。
-
在书本设置中,可以创建6个书本对象。
-
您可以设置各种指针,特别是将
temp
设置为a
的地址书 -
退出功能手册Setup。
-
此时,所有书籍对象都已销毁
-
因此,您从bookSetup返回时带有一个指向已销毁对象的指针。
-
因此,当您尝试使用该指针时,您的程序将崩溃。
这种方法不起作用。你需要学习另一种叫做"动态分配"的技术。这将使用new
创建图书。动态创建的对象不会自动销毁,因此对于链表,您确实需要使用动态分配。
例如
Book* a = new Book("A Tale of Two Cities", "Charles Dickens", 1203456, true);
是的,我看得出来。
在c++中,对象保存在堆中。当函数超出作用域时,将释放(删除)保存在堆中的变量。
你的程序中的问题是:
bookSetup函数正在堆上创建对象然后它返回对这些对象的引用(内存中的地址)。但是当函数结束时,堆中的所有对象都将被删除。因此,您返回一个指向零的地址。
为了解决这个问题,您需要将这些对象保存在堆栈中,而不是堆中。
要做到这一点,您可以使用关键字"new"(在堆栈上分配空间的"new"关键字)
如果我记得这是语法:
Book* a = new Book("A Tale of Two Cities", "Charles Dickens", 1203456, true);
Book* b= new Book("Lord of the rings", "J.R.R Tolkein", 123456, true);
Book* c= new Book("Le Petit Prince", "Antoine de Saint-Exupéry", 123457, true);
Book* d= new Book("And Then There Were None", "Agatha Christie", 123458, true);
Book* e= new Book("Dream of the Red Chamber","Cao Xueqin",123459, true);
Book* f= new Book("The Hobbit","J.R.R Tolkein",123467, true);
- 从函数返回const char*数组
- 检查函数返回类型是否与STL容器类型值相同
- 从 c 或 cpp 系列子函数返回到主函数
- 从函数返回任意简单类型的数据
- 警告:在函数返回类型 [-Wignore 限定符] 时忽略类型限定符
- 从 C++ 中的函数返回数组地址问题
- VirtDisk.h QueryChangesVirtualDisk() 函数返回 RangeCount 为 0
- 为什么glGetSubroutineIndex为不同的函数返回相同的值?
- 在 c++ 中将函数返回类型指定为模板参数
- 从封装在对象中的函数 C++ 返回时为空的列表
- 为什么向量内部的指针在从函数返回时会发生变化?
- 函数返回的 rvalue 引用(表达式)是 xvalue - 但没有标识?
- 程序中的布尔函数返回输入的范围无论如何都是无效的
- 寿命延长从函数返回引用
- 程序不向函数返回值
- 字符串函数返回奇怪的值
- 类的大问题,以及从空函数c++返回
- 为什么在尝试测量函数返回所需的时间时,我的运行时编号是错误的?
- C++二叉搜索树模板从函数返回节点
- NVCC 错误:string_view.h:constexpr 函数返回是非常量