C++ C++;指向Struct的函数返回指针异常
我正在做一个作业,创建一个程序,可以使用链表从文本文件中读取多项式。当我试图从read_poly函数返回链表“poly_pointer”的起始指针时,事情变得很奇怪 预期输出应为-12 但我得到的是-10 如果我在返回read_poly之前添加一行代码C++ C++;指向Struct的函数返回指针异常,c++,function,pointers,struct,return,C++,Function,Pointers,Struct,Return,我正在做一个作业,创建一个程序,可以使用链表从文本文件中读取多项式。当我试图从read_poly函数返回链表“poly_pointer”的起始指针时,事情变得很奇怪 预期输出应为-12 但我得到的是-10 如果我在返回read_poly之前添加一行代码 cout << curr_ptr->coef; 多项式 #include <iostream> #include <fstream> #include <string> #inclu
cout << curr_ptr->coef;
多项式
#include <iostream>
#include <fstream>
#include <string>
#include "Polynomial.h"
using namespace std;
poly_pointer addNode(int coef, int expon)
{
poly_node a;
poly_pointer ptr = &a;
a.coef = coef;
a.expon = expon;
return ptr;
}
poly_pointer read_poly(const char* fileName)
{
poly_pointer start_ptr, curr_ptr;
start_ptr = curr_ptr = addNode(-1, 6);
curr_ptr = curr_ptr->link = addNode(2, 3);
return start_ptr;
}
#包括
#包括
#包括
#包括“多项式.h”
使用名称空间std;
多边形指针addNode(int coef,int expon)
{
poly_节点a;
多边形指针ptr=&a;
a、 coef=coef;
a、 expon=expon;
返回ptr;
}
多边形指针读取多边形(常量字符*文件名)
{
多指针启动ptr,当前ptr;
start_ptr=curr_ptr=addNode(-1,6);
curr\u ptr=curr\u ptr->link=addNode(2,3);
返回启动ptr;
}
main.cpp
#include <iostream>
#include "Polynomial.h"
using namespace std;
int main(void)
{
poly_pointer a, b, d, e, f;
a = read_poly("input1.txt");
cout << a->coef;
cout << a->link->coef;
cout << "\n-eop-";
cin.get();
return 0;
}
#包括
#包括“多项式.h”
使用名称空间std;
内部主(空)
{
多边形指针a、b、d、e、f;
a=读取多边形(“input1.txt”);
库特系数;
cout-link->coef;
库特
糟糕!您返回了一个指向局部变量的指针。在函数退出后使用该指针会触发未定义的行为。如果要返回一个在函数生命周期结束后仍然存在的值,请使用malloc
或new
。addNode返回指向本地分配的poly_节点的指针
下面是松散的内存分配,但会起作用
poly_pointer a = new poly_pointer();
a->coef = coef;
a->expon = expon;
return a;
只需按值返回即可。对于您拥有的结构,这很好
poly_node addNode(int coef, int expon)
{
poly_node a;
a.coef = coef;
a.expon = expon;
return a;
}
如果类型较大,则在堆上分配内存并返回指针。释放内存的所有权在方法的调用方
poly_pointer addNode(int coef, int expon)
{
poly_pointer a = new poly_node();
a->coef = coef;
a->expon = expon;
return a;
}
如果您的编译器支持std::unique\u ptr或std::shared\u指针,那么请使用它们而不是原始指针。\u多项式\u H\u
违反了保留标识符的规则:。您还应该不惜一切代价避免在头文件的全局范围内使用命名空间std;
。至于您的问题,quest中的代码对于MaloC,答案看起来都是C风格的代码,而不是C++。谢谢你,我想我理解你在说什么。但是我应该怎么处理我的代码才能使它正常工作?对不起,我对指针的东西很陌生。@ HehanTaI,一个智能指针不会泄漏给你,你可以轻松地传递它。C++ 03只是有<代码】。>auto_ptr,在C++11中被三个不同的指针替换。更简单的方法可能是根本不使用指针,让NRVO做它的事情。thx,但我得到了一个类似于1>多项式.cpp(9)的错误:错误C2440:“初始化”:无法从“poly_-pointer*”转换为“poly_-pointer”。抱歉,我在那里混合了表示法。使用新的poly_节点。在表示法上,使用typedef指针类型会使某些方面更加混乱,至少对我来说是这样。您可以坚持在代码中仅使用poly_-pointer*类型。不过其他注释并不错误。这是如果以后不删除指针,实现可能会泄漏。这是可行的,但要继续学习指针。嗯……指针意义上的泄漏到底是什么?我应该怎么做才能删除指针?我应该删除指针和main()的结尾吗?
poly_node addNode(int coef, int expon)
{
poly_node a;
a.coef = coef;
a.expon = expon;
return a;
}
poly_pointer addNode(int coef, int expon)
{
poly_pointer a = new poly_node();
a->coef = coef;
a->expon = expon;
return a;
}