debugging 需要帮助:C++调试[已关闭]

5gfr0r5j  于 2023-03-03  发布在  其他
关注(0)|答案(1)|浏览(123)

编辑问题以包含desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答问题。
18小时前关门了。
Improve this question
我在处理leetcode 88时遇到了一个问题。合并排序数组。我试图使用与合并排序相同的逻辑来合并两个排序数组。我的代码在测试用例中遇到了运行时错误:

nums1 =
[0,2,0,0,0,0,0,0]
m =
2
nums2 =
[-1,1,1,2,2,3]
n =
6

下面是错误消息:

=================================================================
==32==ERROR: AddressSanitizer: heap-use-after-free on address 0x603000000be4 at pc 0x000000346c3e bp 0x7ffd548e2570 sp 0x7ffd548e2568
READ of size 4 at 0x603000000be4 thread T0
    #2 0x7f3aedd7b0b2  (/lib/x86_64-linux-gnu/libc.so.6+0x270b2)
0x603000000be4 is located 4 bytes inside of 32-byte region [0x603000000be0,0x603000000c00)
freed by thread T0 here:
    #5 0x7f3aedd7b0b2  (/lib/x86_64-linux-gnu/libc.so.6+0x270b2)
previously allocated by thread T0 here:
    #6 0x7f3aedd7b0b2  (/lib/x86_64-linux-gnu/libc.so.6+0x270b2)
Shadow bytes around the buggy address:
  0x0c067fff8120: fa fa fd fd fd fa fa fa fd fd fd fd fa fa fd fd
  0x0c067fff8130: fd fa fa fa fd fd fd fa fa fa fd fd fd fa fa fa
  0x0c067fff8140: fd fd fd fd fa fa fd fd fd fa fa fa fd fd fd fd
  0x0c067fff8150: fa fa fd fd fd fa fa fa fd fd fd fa fa fa fd fd
  0x0c067fff8160: fd fd fa fa fd fd fd fa fa fa fd fd fd fd fa fa
=>0x0c067fff8170: fd fd fd fa fa fa fd fd fd fa fa fa[fd]fd fd fd
  0x0c067fff8180: fa fa fd fd fd fa fa fa 00 00 00 00 fa fa fa fa
  0x0c067fff8190: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c067fff81a0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c067fff81b0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c067fff81c0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
Shadow byte legend (one shadow byte represents 8 application bytes):
  Addressable:           00
  Partially addressable: 01 02 03 04 05 06 07 
  Heap left redzone:       fa
  Freed heap region:       fd
  Stack left redzone:      f1
  Stack mid redzone:       f2
  Stack right redzone:     f3
  Stack after return:      f5
  Stack use after scope:   f8
  Global redzone:          f9
  Global init order:       f6
  Poisoned by user:        f7
  Container overflow:      fc
  Array cookie:            ac
  Intra object redzone:    bb
  ASan internal:           fe
  Left alloca redzone:     ca
  Right alloca redzone:    cb
  Shadow gap:              cc
==32==ABORTING

我不知道这是怎么回事。我试着减少和增加num2一个数字,我的代码工作,但它不断失败的具体情况下,我分享在这里。请帮助我调试。
该计划:

class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        if (n == 0) ;
        else if (m == 0) {
            nums1.swap(nums2);
        }
        else {
            std::vector<int>::iterator it1 = nums1.begin(), it2 = nums2.begin();
            while(true) {
                if (n == 0) break;
                else {
                    if(m > 0 && *it1<*it2) {
                        cout<<1<<std::endl;
                        advance(it1,1);
                        m--;
                    } else {
                        nums1.insert(it1, *it2);
                        nums1.pop_back();
                        advance(it1,1);
                        advance(it2,1);
                        n--;
                    }
                }
            }
        }
    }
};

我尝试在每次迭代中输出 * it1和 * it2的值,发现 * it1在第二次迭代中导致了问题,但是我不明白为什么。

x759pob2

x759pob21#

不能指望迭代器在插入后有效。
根据documentation
如果新的size()大于旧的capacity(),则导致重新分配。如果新的size()大于capacity(),则所有迭代器和引用都将无效。否则,只有插入点之前的迭代器和引用仍然有效。结尾后的迭代器也将无效。
注意insert方法返回一个迭代器,这很重要,你可以使用它:

it1 = nums1.insert(it1, *it2);

这可能不是你唯一的问题,但这是一个开始。

相关问题