【问题标题】:Getting a free(): invalid pointer error获取 free(): 无效指针错误
【发布时间】:2016-04-08 16:58:56
【问题描述】:

我正在尝试制作一个程序,在具有最多 e 的字符串上将字符 e 替换为 *,但是每当我运行此程序时,我都会得到一个随机的 free(): invalid pointer 错误:

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

int main()
{
    const char char1 = 'e', char2 = '*';
    int N, mostchars = 0, its;

    cout << "N = ";
    cin >> N;
    string strings[N];

    for(int i = 1; i <= N; i++)
    {
        cin >> strings[i];
        if(mostchars < count(strings[i].begin(), strings[i].end(), char1))
        {
            mostchars = count(strings[i].begin(), strings[i].end(), char1);
            its = i;
        }
    }
    replace(strings[its].begin(), strings[its].end(), char1, char2);
    cout << strings[its] << endl;
    return 0;
}

这是 gdb 的输出:

*** Error in `/home/hiddendirishidden/STRING/bin/Debug/STRING': free(): invalid pointer: 0x00007fffffffe6a0 ***
======= Backtrace: =========
/usr/lib/libc.so.6(+0x6f364)[0x7ffff720a364]
/usr/lib/libc.so.6(+0x74d96)[0x7ffff720fd96]
/usr/lib/libc.so.6(+0x7557e)[0x7ffff721057e]
/usr/lib/libstdc++.so.6(_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_mutateEmmPKcm+0xfd)[0x7ffff7b765dd]
/usr/lib/libstdc++.so.6(_ZStrsIcSt11char_traitsIcESaIcEERSt13basic_istreamIT_T0_ES7_RNSt7__cxx1112basic_stringIS4_S5_T1_EE+0x314)[0x7ffff7afd624]
/home/hiddendirishidden/STRING/bin/Debug/STRING[0x400e13]
/usr/lib/libc.so.6(__libc_start_main+0xf0)[0x7ffff71bb710]
/home/hiddendirishidden/STRING/bin/Debug/STRING[0x400c39]
======= Memory map: ========
00400000-00402000 r-xp 00000000 08:21 1452363                            /home/hiddendirishidden/STRING/bin/Debug/STRING
00601000-00602000 rw-p 00001000 08:21 1452363                            /home/hiddendirishidden/STRING/bin/Debug/STRING
00602000-00634000 rw-p 00000000 00:00 0                                  [heap]
7ffff0000000-7ffff0021000 rw-p 00000000 00:00 0 
7ffff0021000-7ffff4000000 ---p 00000000 00:00 0 
7ffff719b000-7ffff7333000 r-xp 00000000 08:21 396432                     /usr/lib/libc-2.23.so
7ffff7333000-7ffff7532000 ---p 00198000 08:21 396432                     /usr/lib/libc-2.23.so
7ffff7532000-7ffff7536000 r--p 00197000 08:21 396432                     /usr/lib/libc-2.23.so
7ffff7536000-7ffff7538000 rw-p 0019b000 08:21 396432                     /usr/lib/libc-2.23.so
7ffff7538000-7ffff753c000 rw-p 00000000 00:00 0 
7ffff753c000-7ffff7552000 r-xp 00000000 08:21 396763                     /usr/lib/libgcc_s.so.1
7ffff7552000-7ffff7751000 ---p 00016000 08:21 396763                     /usr/lib/libgcc_s.so.1
7ffff7751000-7ffff7752000 rw-p 00015000 08:21 396763                     /usr/lib/libgcc_s.so.1
7ffff7752000-7ffff7855000 r-xp 00000000 08:21 396490                     /usr/lib/libm-2.23.so
7ffff7855000-7ffff7a55000 ---p 00103000 08:21 396490                     /usr/lib/libm-2.23.so
7ffff7a55000-7ffff7a56000 r--p 00103000 08:21 396490                     /usr/lib/libm-2.23.so
7ffff7a56000-7ffff7a57000 rw-p 00104000 08:21 396490                     /usr/lib/libm-2.23.so
7ffff7a57000-7ffff7bc9000 r-xp 00000000 08:21 396798                     /usr/lib/libstdc++.so.6.0.21
7ffff7bc9000-7ffff7dc9000 ---p 00172000 08:21 396798                     /usr/lib/libstdc++.so.6.0.21
7ffff7dc9000-7ffff7dd3000 r--p 00172000 08:21 396798                     /usr/lib/libstdc++.so.6.0.21
7ffff7dd3000-7ffff7dd5000 rw-p 0017c000 08:21 396798                     /usr/lib/libstdc++.so.6.0.21
7ffff7dd5000-7ffff7dd9000 rw-p 00000000 00:00 0 
7ffff7dd9000-7ffff7dfc000 r-xp 00000000 08:21 396431                     /usr/lib/ld-2.23.so
7ffff7fc5000-7ffff7fcb000 rw-p 00000000 00:00 0 
7ffff7ff7000-7ffff7ff8000 rw-p 00000000 00:00 0 
7ffff7ff8000-7ffff7ffa000 r--p 00000000 00:00 0                          [vvar]
7ffff7ffa000-7ffff7ffc000 r-xp 00000000 00:00 0                          [vdso]
7ffff7ffc000-7ffff7ffd000 r--p 00023000 08:21 396431                     /usr/lib/ld-2.23.so
7ffff7ffd000-7ffff7ffe000 rw-p 00024000 08:21 396431                     /usr/lib/ld-2.23.so
7ffff7ffe000-7ffff7fff000 rw-p 00000000 00:00 0 
7ffffffde000-7ffffffff000 rw-p 00000000 00:00 0                          [stack]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]

Program received signal SIGABRT, Aborted.
0x00007ffff71ce2a8 in raise () from /usr/lib/libc.so.6

我不确定为什么会这样。也许我做错了什么,毕竟这是我第一次尝试算法库。

【问题讨论】:

  • for(int i = 1; i &lt;= N; i++) 你是说for(int i = 0; i &lt; N; i++) 吗?
  • @Michael 是的,谢谢它现在可以工作了:D
  • 您还可能引用了未分配的值。仅当控制流进入您的“if”块时才设置“它”

标签: c++


【解决方案1】:

for(int i = 1; i <= N; i++)

您正在使用从 1 开始的索引。 strings 仅具有索引从 0N-1 的元素,strings[N] 是无效访问。

C++ 约定是从 0 开始的索引。做

for(int i = 0; i < N; ++i)

您可能还想初始化变量并检查输入错误。

【讨论】:

    【解决方案2】:

    您使用变量来确定数组的长度。你不能在 C++ 中安全地做到这一点。

    使用std::vector&lt;std::string&gt; 而不是std::string[N]

    此外,您的循环是 1 → N,而不是正确的 0 → N-1。这意味着您尝试在最终迭代中访问的 std::string 不存在,因此 std::string 在内部执行的各种分配被破坏。

    【讨论】:

    • 您能否详细说明 C++ 中的 VLA 有什么问题? g++ supports them as an extension.
    • @MaximEgorushkin:“扩展”是关键词。 :) VLA 不在 C++ 中。
    • 您可能会感到惊讶,但是人们在线程在 C++ 中之前就已经编写了多线程应用程序并且天没有塌下来。
    • @MaximEgorushkin:是的,通过研究他们的编译器并努力设置他们知道会产生正​​确结果的编译器标志。欧普正在学习。至少我们应该教育 VLA 不在 C++ 中。我这样说主要是因为我见过没有 VLA 的编译器(或禁用扩展,坦率地说应该如此!)无法诊断出将 runtime 常量用作数组绑定和一切都乱了套。我说,让我们在教学时默认“不使用 VLA”。 OP 总是可以决定继续使用它,但有了新知识,他/她应该谨慎/注意。
    • 那个编译器是什么?
    猜你喜欢
    • 1970-01-01
    • 2018-06-18
    • 2018-09-17
    • 1970-01-01
    • 2012-02-21
    • 1970-01-01
    • 2018-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多