精华内容
下载资源
问答
  • 1、问题描述若已定义的函数有返回值,则以下关于该函数调用的叙述中错误的是( D ) A)函数调用可以作为独立的语句存在 B)函数调用可以作为一个函数的实参 C)函数调用可以出现在表达式中 D)函数调用可以作为一个...

    1、问题描述

    若已定义的函数有返回值,则以下关于该函数调用的叙述中错误的是( D )

    A)函数调用可以作为独立的语句存在

    B)函数调用可以作为一个函数的实参

    C)函数调用可以出现在表达式中

    D)函数调用可以作为一个函数的形参

    解析:返回值存在寄存器中, 没有地址, 不能作为形参,但可以作为实参。

    2、形参与实参区别

    形参出现在函数定义中,在整个函数体内都可以使用, 离开该函数则不能使用。
    实参出现在主调函数中,进入被调函数后,实参变量也不能使用。
    形参和实参的功能是作数据传送。发生函数调用时, 主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调函数的数据传送。

    1.形参变量只有在被调用时才分配内存单元,在调用结束时, 即刻释放所分配的内存单元。因此,形参只有在函数内部有效。 函数调用结束返回主调函数后则不能再使用该形参变量。

    2.实参可以是常量、变量、表达式、函数等, 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参。 因此应预先用赋值,输入等办法使实参获得确定值。

    3.实参和形参在数量上,类型上,顺序上应严格一致, 否则会发生“类型不匹配”的错误。

    4.函数调用中发生的数据传送是单向的。 即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。 因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化。

    5.当形参和实参不是指针类型时,在该函数运行时,形参和实参是不同的变量,他们在内存中位于不同的位置,形参将实参的内容复制一份,在该函数运行结束的时候形参被释放,而实参内容不会改变。而如果函数的参数是指针类型变量,在调用该函数的过程中,传给函数的是实参的地址,在函数体内部使用的也是实参的地址,即使用的就是实参本身。所以在函数体内部可以改变实参的值。(值传递与址传递)

    展开全文
  • 若已定义的函数有返回值,则以下关于该函数调用的叙述中错误的是( D ) A)函数调用可以作为独立的语句存在 B)函数调用可以作为一个函数的实参 C)函数调用可以出现在表达式中 D)函数调用可以作为一个函数的...

    1、问题描述

    若已定义的函数有返回值,则以下关于该函数调用的叙述中错误的是( D )

    A)函数调用可以作为独立的语句存在

    B)函数调用可以作为一个函数的实参

    C)函数调用可以出现在表达式中

    D)函数调用可以作为一个函数的形参

    解析:返回值存在寄存器中, 没有地址, 不能作为形参,但可以作为实参。

    2、形参与实参区别

    形参出现在函数定义中,在整个函数体内都可以使用, 离开该函数则不能使用。 
    实参出现在主调函数中,进入被调函数后,实参变量也不能使用。 
    形参和实参的功能是作数据传送。发生函数调用时, 主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调函数的数据传送。

    1.形参变量只有在被调用时才分配内存单元,在调用结束时, 即刻释放所分配的内存单元。因此,形参只有在函数内部有效。 函数调用结束返回主调函数后则不能再使用该形参变量。

    2.实参可以是常量、变量、表达式、函数等, 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参。 因此应预先用赋值,输入等办法使实参获得确定值。

    3.实参和形参在数量上,类型上,顺序上应严格一致, 否则会发生“类型不匹配”的错误。

    4.函数调用中发生的数据传送是单向的。 即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。 因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化。

    5.当形参和实参不是指针类型时,在该函数运行时,形参和实参是不同的变量,他们在内存中位于不同的位置,形参将实参的内容复制一份,在该函数运行结束的时候形参被释放,而实参内容不会改变。而如果函数的参数是指针类型变量,在调用该函数的过程中,传给函数的是实参的地址,在函数体内部使用的也是实参的地址,即使用的就是实参本身。所以在函数体内部可以改变实参的值。(值传递与址传递)

    展开全文
  • c++ 纯虚函数调用 错误原因

    千次阅读 2019-11-28 18:38:22
    最近写程序时,做了一个基类供其他模块调用,调试时出现了下面的错误: pure virtual method called 如图所示: 纯虚函数调用。纯虚函数是需要子类具体实现的函数,怎么就被调用了呢? 首先明确观点:永远...

    问题描述


    最近写程序时,做了一个基类供其他模块调用,调试时出现了下面的错误:

    pure virtual method called

    如图所示:

    在这里插入图片描述

    纯虚函数被调用。纯虚函数是需要子类具体实现的函数,怎么就被调用了呢?

    首先明确观点:永远不要在构造和析构中直接/间接调用virtual函数。

    下面是根据查阅的资料和自己的理解作出的解释,供参考。

    抽象类和纯虚函数


    来复习一下c++中的纯虚函数和抽象类。

    c++使用虚函数来实现运行时多态,如:

    class Shape {
    public:
            virtual double area() const = 0;
            double value() const;
            // Effective c++ 第三版之条款7:
            virtual ~Shape();
    protected:
            Shape(double valuePerSquareUnit);
    private:
            double valuePerSquareUnit_;
    };
    
    class Rectangle : public Shape {
    public:
            Rectangle(double width, double height, double valuePerSquareUnit);
            virtual double area() const;
            
            virtual ~Rectangle();
    // ...
    };
    
    class Circle : public Shape {
    public:
            Circle(double radius, double valuePerSquareUnit);
            virtual double area() const;
            
            virtual ~Circle();
    // ...
    };
    
    double
    Shape::value() const
    {
            // Area is computed differently, depending
            // on what kind of shape the object is:
            return valuePerSquareUnit_ * area();
    }
    

    Effective c++ 第三版之条款7: 为多态基类声明virtual 析构函数。

    基类Shape中声明了纯虚的area()成员函数,即所谓的抽象基类,子类 Rectangle 和 Circle 分别作出了各自的实现。当虚函数被调用时,执行的具体版本取决于指针或者引用的类型。

    如下代码:

    print(shape->area());

    可能调用 Circle::area(),也可能调用Rectangle::area(),取决于运行时 shape的实际类型。

    虚函数表vtbl


    运行时多态的实现的通常解释是使用虚函数表(virtual table),它是一个保存函数指针的数组。

    具有虚函数的类都会维护一个函数指针的数组,该类的每个实例都有一个指向vtbl的指针,如下图所示:

    在这里插入图片描述

    在拥有纯虚函数的抽象类中,由于没有具体的函数实现,c++通常会把它的vtbl存放一个特殊函数,该函数会输出“Pure virtual function called”,并终止程序。

    构造步骤


    在构建派生类的实例时,如果它具有vtbl,过程大致为:

    1. 构建顶层基类:

    a. 使实例指向基类的vtbl
    b. 构造基类实例成员变量
    c. 执行基类构造函数的主体

    1. 构建派生类(递归方式)

    a. 使实例指向派生类的vtbl
    b. 构造派生类实例成员变量
    c. 执行派生类构造函数的主体

    析构过程与构造过程相反,大致为:

    1. 析构派生类

    a. (实例已经指向派生类的vtbl)
    b. 执行派生类析构函数主体
    c. 析构派生类实例成员变量

    1. 析构基类(递归)

    a. 使实例指向基类的vtbl
    b. 执行基类析构函数主体
    c. 析构基类实例成员变量

    两个常见错误


    1. 直接在构造函数中调用虚函数
    Shape(double valuePerSquareUnit)
            : valuePerSquareUnit_(valuePerSquareUnit)
    {
            // ERROR: 违背了Effective C++ 条款9!
            std::cout << "creating shape, area = " << area() << std::endl;
    }
    

    Effective C++ 条款9:绝不在构造和析构过程中调用virtual函数。

    在构造或析构中直接调用虚函数时,编译器可能会发出警告。

    1. 间接调用
    Shape::Shape(double valuePerSquareUnit)
            : valuePerSquareUnit_(valuePerSquareUnit)
    {
            // ERROR
            std::cout << "creating shape, value = " << value() << std::endl;
    }
    

    在上述构造过程的1-c中,调用了成员函数value,value又调用了纯虚函数area,这时对象的实例还未构造,就可能会看到“Pure virtual function called”。

    还有一个


    考虑如下代码:

    Shape* p1 = new Rectangle(width, height, valuePerSquareUnit); // 创建对象实例
    std::cout << "value = " << p1->value() << std::endl; // ok
    Shape* p2 = p1;  // Need another copy of the pointer. 注意,为避免问题,请使用智能指针
    delete p1; // 对象进行2步析构:先析构派生类,再析构基类,p1可能发生变化
    std::cout << "now value = " << p2->value() << std::endl; // error, 间接指向“悬空”的指针。 这是指向已删除对象或已释放内存的指针,或两者都有
    

    当p2指向过时对象时,结果是未定义的,它可能崩溃或继续运行,产生错误结果或者在未来某一时刻崩溃。 在实践中,有几种常见的可能性(可能一致或不一致):

    • 内存可能被标记为已释放。任何访问它的尝试都将立即标记为使用了悬空指针。某些工具(BoundsChecker,Purify,valgrind和其他工具)可能会检测到这些情况。
    • 内存可能被故意加密。释放后,内存管理系统可能会将类似垃圾的值写入内存。 (其中一个值是“死牛肉”:0xDEADBEEF,无符号十进制3735928559,带符号十进制-559038737。)
    • 内存可能会被重用。如果在删除对象和使用悬挂指针之间执行了其他代码,则内存分配系统可能已经从旧对象使用的部分或全部内存中创建了一个新对象。如果幸运的话,这看起来像垃圾,程序立即崩溃。否则,该程序可能会在某个时间之后崩溃,可能是在凝结其他对象之后,通常是在根本原因问题发生很长时间之后。这种问题使C++程序员发疯。
    • 内存可能已经完全保留了。

    最后一种情况下,内存完全保留意味它是抽象基类的实例,如果为该对象调用纯虚成员函数,会发生什么?

    “Pure virtual function called”

    总结


    根据以上分析,以下情况会导致异常:

    • 从基类构造函数直接调用虚函数。
    • 从基类析构函数直接调用虚函数。
    • 从基类构造函数间接调用虚函数。
    • 从基类析构函数间接调用虚函数。
    • 通过悬空指针调用虚拟函数。

    实际中编译器和程序的行为可能会因编译器类型和程序执行环境而异。

    参考资料

    “Pure Virtual Function Called”: An Explanation
    [Effective c++ 第三版]

    展开全文
  • 每日练习以下描述错误的是:函数调用可以(D) A) 出现在执行语句 B) 出现在一个表达式 C) 作为一个函数的实参 D) 作为一个函数的形参 解析 函数返回值在寄存器中, 没有地址, 不能作为形参,但可以作为实参

    每日练习

    以下描述错误的是:函数调用可以(D):
    A) 出现在执行语句
    B) 出现在一个表达式
    C) 作为一个函数的实参
    D) 作为一个函数的形参

    解析
    函数返回值在寄存器中, 没有地址, 不能作为形参,但可以作为实参

    展开全文
  • title: 用户态使用 glibc/backtrace 追踪函数调用堆栈定位段错误 date: 2018-09-02 18:40 author: gatieme tags: linux categories: - debug thumbnail: blogexcerpt: 一般用户态程序出现段错误, 而我们想要察看函数...
  • linux shell 可以用户定义函数,然后在shell脚本中可以随便调用。Shell 函数定义的语法格式如下: [function] funname [()]{ 函数体 [return int;] } 格式1: 简化写法,不写 function 关键字: 函数名(){ ...
  • 一般察看函数运行时堆栈的方法是使用GDB(bt... 在glibc头文件"execinfo.h"中声明了三个函数用于获取当前线程的函数调用堆栈。int backtrace(void **buffer,int size) 该函数用于获取当前线程的调用堆栈,获取的信息将
  • 汇编:函数调用

    千次阅读 2019-07-18 18:57:33
    让我们再回忆一下脑海中关于函数调用的概念,也许会是这个样子: 这里的“控制流转移”又是如何发生的呢?在解释这个之前,也许我们需要科普一点有关于汇编的知识。 2. 函数调用中的一些细节说明 2.1 函数调用中的...
  • 一般察看函数运行时堆栈的方法是使用GDB(bt命令)之类的...在glibc头文件"execinfo.h"中声明了三个函数用于获取当前线程的函数调用堆栈。   int backtrace(void **buffer,int size) 该函数用于获取当前线程的调用
  • 本关的目标是让读者了解并掌握函数调用的相关知识。 相关知识 定义函数与调用函数的顺序 在定义了函数之后,就可以调用该函数了,但是在Python中我们要注意一个关键点,就是Python不允许前向引用,即在函数定义...
  • C++函数调用过程深入分析

    千次阅读 2017-12-19 13:56:20
    0. 引言 函数调用的过程实际上也就是一个中断的过程,那么C++中到底是怎样实现一个函数的调用的呢?参数入栈、函数跳转、保护现场、回复现场等又是怎样实现的呢?本文将对函数调用的过程进行深入的分析和详细解释,...
  • Windows系统调用学习笔记(一)—— API函数调用过程前言Windows API实验:分析ReadProcessMemory第一步:定位函数第二步:开始分析 前言 一、学习自滴水编程达人中级班课程,官网:https://bcdaren.com 二、海东...
  • C语言中有关外部函数调用的问题

    万次阅读 多人点赞 2016-06-16 21:44:57
    对于外部函数实体(处于调用函数所在源文件之外的其他源文件中的函数),是在链接过程中,才会被寻找和添加进程序,一旦没有找到函数实体,就会报错,无法成功链接。 而外部函数的声明(一般声明在头文件中)只是令...
  • 每个 C++ 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数。 您可以把代码划分到不同的函数中。如何划分代码到不同的函数中是由您来决定的,但在逻辑上,划分通常是根据每个函数...
  • python笔记-调用eval函数出现invalid syntax错误 本来是想打算使用eval函数对变量进行赋值的,没想到出现了invalid syntax错误。源代码如下 In [2]: eval('a = 1') File "&lt;string&gt;", line ...
  • 函数调用栈与活动记录

    千次阅读 2012-02-19 20:13:14
    函数调用栈与活动记录 在调试的时候经常遇到栈溢出,由此总结了下函数调用栈的知识。 为了理解C++是如何执行函数调用的,先考虑一个称为栈(stack)的数据结构。栈是一种后入先出的数据结构——压入(插入)栈的最后...
  • 函数调用模式4种方式详解

    千次阅读 2017-03-15 22:17:55
    函数调用模式: 函数模式特征:就是一个简单的函数调用,函数名前面没有任何的引导内容function foo(){} var func = function(){}foo(); func(); (function(){})(); this在函数模式中的含义: this在函数中表示全
  • 函数调用 压栈的工作原理

    万次阅读 多人点赞 2017-04-17 15:11:48
     本篇文章着重写的是系统中栈的工作原理,以及函数调用过程中栈帧的产生与释放的过程,有可能名字过大,如果不合适我可以换一个名字,希望大家能够指正,小丁虚心求教!如果有哪里写的不清楚的或者错误的地方请及时...
  • 当我们使用python的print函数时我们感觉十分便利,因为无论是什么类型的数据,数值,字符串,列表…我们都可以通过print函数直接输出,或者赋值给变量以后再输出。print函数中常出现的问题是自动附加空格和多个print...
  • X64的函数调用规则

    千次阅读 2017-01-22 16:14:40
    闲着没事想研究一下gcc的函数调用方式和m$的__stdcall、__fastcall之类有何区别,本想是了解一下关于参数的入栈顺序和清理方,就随便写了个C函数,编译成.s文件,一看发现根本就没有push和pop之类的指令......
  • dlopen 和 dlsym 动态调用函数

    千次阅读 2018-12-31 20:43:24
    Linux/unix 提供了使用 dlopen 和 dlsym 方法动态加载库和调用函数,这套方法在 macOS ...dlerror 返回一个描述最后一次调用dlopen、dlsym,或 dlclose 的错误信息的字符串。 动态调用 printf 函数,编写测试代码如...
  • 最近Luna在把VC6.0下的项目程序用VS2008编译时出现了一个错误,而这... error C3867: “_com_error::ErrorMessage”: 函数调用缺少参数列表;请使用“&_com_error::ErrorMessage”创建指向成员的指针  定位到文件中是
  • 概要:  "Pure Virtual Function Called"是C++程序偶然...对于那些在后期调试时很容易找到的原因,你可以找到很多简单、合理的解释,但是还有其他一些很莫名奇妙的bug导致这个问题。如果你碰到这样的问题,可能意味着
  • verilog文件系统函数调用

    千次阅读 2017-03-01 22:45:12
    返回文件的多通道描述符,只允许写数据,最多能打开31个文件,最高位保留。 注意:用$fopen打开文件会将原来的文件清空,若要读数据就用$readmemb,$readmemh就可以了,这个语句不会清空原来文件中的数据。integerfd...
  • Linux中eventfd函数调用解析

    千次阅读 2013-07-08 11:39:22
    Linux中eventfd函数调用解析 eventfd 在内核版本,2.6.22以后有效。查看内核版本可以用命令 uname -r 。 #include int eventfd(unsigned int initval,int flags); 这个函数会创建一个 事件对象 (eventfd ...
  • 函数调用约定与函数名称修饰规则

    千次阅读 2006-07-25 15:51:00
    使用C/C++语言开发软件的程序员经常碰到这样的问题:有时候是程序编译没有问题,但是链接的时候总是报告函数不存在(经典的LNK 2001错误),有时候是程序编译和链接都没有错误,但是只要调用库中的函数就会出现堆栈...
  • 本小节介绍通过缓冲区溢出调用函数,此外通过学习也对函数栈的了解有所加深,这里加上小段自己对函数栈的理解 函数栈的介绍 通过汇编介绍函数执行过程中栈的变化: EBP:栈底 存储着上一个栈的栈底EBP ESP:栈顶...
  • linux下追踪函数调用堆栈

    万次阅读 2010-10-15 11:30:00
    原址http://blog.chinaunix.net/u1/35065/showart_2147701.html<br />  ... <br />在头文件"execinfo.h"中声明了三个函数用于获取当前线程的函数调用堆栈 <br />Function: int backtrace(void *
  • 上一篇我们简单地介绍了Lua的函数,这次,我们来点特别的,来介绍一下Lua的函数(小若:等等,我是不是错过了什么?) 笨木头花心贡献,哈?花心?不,是用心~转载请注明,原文地址:...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 462,088
精华内容 184,835
关键字:

以下错误的描述是函数调用可以