`main' 中的错误:free():无效指针(尽管没有使用 free 或 delete)

Posted

技术标签:

【中文标题】`main\' 中的错误:free():无效指针(尽管没有使用 free 或 delete)【英文标题】:Error in `main': free(): invalid pointer (though no free or delete used)`main' 中的错误:free():无效指针(尽管没有使用 free 或 delete) 【发布时间】:2016-01-11 05:10:26 【问题描述】:

我想在 tutorialspoint.com 中运行这个简单的代码

#include <iostream>

using namespace std;

class Vehicle 
    string vehicleNo;
    string color;

    protected:
    string getVehicleNo()
    
        return vehicleNo;
    

    string setVehicleNo(string num)
    
        vehicleNo = num;
    

    string getColor()
    
        return color;
    

    string setColor(string someColor)
    
        color = someColor;
    
;

class Car: public Vehicle 
    private:
    int distance;

    public:
    void setDistance(int a)
    
        distance = a;
    

    int calculateFare(int)
    
        return distance * 5;
    

    void displayInformation()
    
        cout << distance << endl; 
    

    void useSetVehicleNo(string num)
    
        setVehicleNo(num);
    

    string useSetColor(string someColor)
    
        setColor(someColor);
    

    string useGetVehicleNo()
    
        return getVehicleNo();
    

    string useGetColor()
    
        return getColor();
    
;

int main()

   //string exit=n;
   string vehicleNo;
   string color;
   Car car;

   cout << "Enter car number : " << endl;
   cin >> vehicleNo;
   car.useSetVehicleNo(vehicleNo);

   cout << "Enter car color : " << endl;
   cin >> color;
   car.useSetColor(color);

   //vehicleNo = car.useGetColor();
   //color = car.useGetVehicleNo();

   //cout << vehicleNo;
   //cout << color;


   return 0;

运行它会给我以下输出

输入车号: 1 输入汽车颜色: 克

* `main' 中的错误:free():无效指针:0x00007ff3aa205ba8 * ======= 回溯:========= /lib64/libc.so.6(+0x7850e)[0x7ff3a969450e] /lib64/libc.so.6(cfree+0x5b5)[0x7ff3a96a0165] 主[0x400e97] 主[0x400c79] /lib64/libc.so.6(__libc_start_main+0xf0)[0x7ff3a963bfe0] 主[0x400ac9]

======= 内存映射:========= 00400000-00402000 r-xp 00000000 fd:11f 59330668 /home/cg/root/main 00601000-00602000 r--p 00001000 fd:11f 59330668 /home/cg/root/main 00602000-00603000 rw-p 00002000 fd:11f 59330668 /home/cg/root/main 0140c000-0142d000 rw-p 00000000 00:00 0 [堆] 7ff3a961c000-7ff3a97d0000 r-xp 00000000 fd:11f 37749826 /usr/lib64/l ibc-2.20.so 7ff3a97d0000-7ff3a99cf000 ---p 001b4000 fd:11f 37749826 /usr/lib64/l ibc-2.20.so 7ff3a99cf000-7ff3a99d3000 r--p 001b3000 fd:11f 37749826 /usr/lib64/l ibc-2.20.so 7ff3a99d3000-7ff3a99d5000 rw-p 001b7000 fd:11f 37749826 /usr/lib64/l ibc-2.20.so 7ff3a99d5000-7ff3a99d9000 rw-p 00000000 00:00 0 7ff3a99d9000-7ff3a99ef000 r-xp 00000000 fd:11f 37749844 /usr/lib64/l ibgcc_s-4.9.2-20141101.so.1 7ff3a99ef000-7ff3a9bee000 ---p 00016000 fd:11f 37749844 /usr/lib64/l ibgcc_s-4.9.2-20141101.so.1 7ff3a9bee000-7ff3a9bef000 r--p 00015000 fd:11f 37749844 /usr/lib64/l ibgcc_s-4.9.2-20141101.so.1 7ff3a9bef000-7ff3a9bf0000 rw-p 00016000 fd:11f 37749844 /usr/lib64/l ibgcc_s-4.9.2-20141101.so.1 7ff3a9bf0000-7ff3a9cf7000 r-xp 00000000 fd:11f 37749280 /usr/lib64/l ibm-2.20.so 7ff3a9cf7000-7ff3a9ef6000 ---p 00107000 fd:11f 37749280 /usr/lib64/l ibm-2.20.so 7ff3a9ef6000-7ff3a9ef7000 r--p 00106000 fd:11f 37749280 /usr/lib64/l ibm-2.20.so 7ff3a9ef7000-7ff3a9ef8000 rw-p 00107000 fd:11f 37749280 /usr/lib64/l ibm-2.20.so 7ff3a9ef8000-7ff3a9fe8000 r-xp 00000000 fd:11f 37749829 /usr/lib64/l ibstdc++.so.6.0.20 7ff3a9fe8000-7ff3aa1e8000 ---p 000f0000 fd:11f 37749829 /usr/lib64/l ibstdc++.so.6.0.20 7ff3aa1e8000-7ff3aa1f0000 r--p 000f0000 fd:11f 37749829 /usr/lib64/l ibstdc++.so.6.0.20 7ff3aa1f0000-7ff3aa1f2000 rw-p 000f8000 fd:11f 37749829 /usr/lib64/l ibstdc++.so.6.0.20 7ff3aa1f2000-7ff3aa207000 rw-p 00000000 00:00 0 7ff3aa207000-7ff3aa228000 r-xp 00000000 fd:11f 37856921 /usr/lib64/l d-2.20.so 7ff3aa412000-7ff3aa417000 rw-p 00000000 00:00 0 7ff3aa424000-7ff3aa428000 rw-p 00000000 00:00 0 7ff3aa428000-7ff3aa429000 r--p 00021000 fd:11f 37856921 /usr/lib64/l d-2.20.so 7ff3aa429000-7ff3aa42a000 rw-p 00022000 fd:11f 37856921 /usr/lib64/l 7ff3aa429000-7ff3aa42a000 rw-p 00022000 fd:11f 37856921 /usr/lib64/l d-2.20.so 7ff3aa42a000-7ff3aa42b000 rw-p 00000000 00:00 0 7fff1dddb000-7fff1ddfc000 rw-p 00000000 00:00 0 [堆栈] 7fff1ddfe000-7fff1de00000 r-xp 00000000 00:00 0 [vdso] ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall] 中止 (核心转储)

【问题讨论】:

调高警告级别。 添加#include &lt;string&gt;,如果函数没有返回任何内容,则将返回类型更改为void g++ -Wall -Wextra -g编译并使用valgrind 【参考方案1】:

您的三个函数的返回类型不同于 void,而您没有有效的 return 语句。

如果您提高警告级别,您的编译器会告诉您有关它们的信息。使用g++ -Wall 时,我收到以下消息:

socc.cc: In member function ‘std::string Vehicle::setVehicleNo(std::string)’:
socc.cc:19:4: warning: no return statement in function returning non-void [-Wreturn-type]
    
    ^
socc.cc: In member function ‘std::string Vehicle::setColor(std::string)’:
socc.cc:29:4: warning: no return statement in function returning non-void [-Wreturn-type]
    
    ^
socc.cc: In member function ‘std::string Car::useSetColor(std::string)’:
socc.cc:60:7: warning: no return statement in function returning non-void [-Wreturn-type]
       

   ^

调用此类函数会导致未定义的行为。

来自 C++11 标准:

6.6.3 return 声明

2 ... ... 从函数的末尾流出相当于没有值的返回;这导致未定义 值返回函数中的行为。

您可以通过添加合适的return 语句来解决此问题。例如

第一个函数:

string setVehicleNo(string num)

   vehicleNo = num;
   return vehicleNo; // Add this, maybe?

第二个功能:

string setColor(string someColor)

   color = someColor;
   return color;  // Add this, maybe

第三个功能:

string useSetColor(string someColor)

   return setColor(someColor); // Add the return, maybe?

【讨论】:

谢谢...我不敢相信我犯了这个愚蠢的错误,但这是因为我依赖编译器来为这个错误返回一个错误。太棒了:)【参考方案2】:

你的问题在这里:

   string setVehicleNo(string num)
// ^^^^^^
   
        vehicleNo = num;
   

您正在定义一个返回类型,但实际上并没有返回一个值(您应该已经收到关于此的编译器警告)。

修复指定void返回类型或返回值。

与您的其他功能类似。见固定demo here。

【讨论】:

【参考方案3】:

在您的代码中进行以下更改:

第一 -

string setVehicleNo(string num)
// ^^^^^^
   
        vehicleNo = num;
   

秒 -

string setColor(string someColor)
// ^^^^^^
    
        color = someColor;
    

第三个 -

string useSetColor(string someColor)
//^^^^^^
    
        setColor(someColor);
    

您已将返回类型分配给string,但未返回任何值。将其更改为void。查看此处所做的更改http://ideone.com/n1Wg15

【讨论】:

是的,正如我的回答中提到的那样,可以以这种方式或另一种方式解决。

以上是关于`main' 中的错误:free():无效指针(尽管没有使用 free 或 delete)的主要内容,如果未能解决你的问题,请参考以下文章

*** `./pw' 中的错误:free():无效指针:0x0000000000602200 ***

如何强制中止“glibc检测到*** free():无效指针”

free():vector <vec4i> c ++的无效指针[关闭]

在 C 中使用 free() 时出现无效(中止)核心转储错误

free():在 unique_ptr 上使用 get() 而不是 release() 时指针无效

随机错误核心转储:`./a.out' 中的错误:free():下一个大小无效(快速):0x00000000010e8d70 *** 中止(核心转储)