- 已关闭。**此问题需要debugging details。当前不接受答案。
编辑问题以包含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在第二次迭代中导致了问题,但是我不明白为什么。
1条答案
按热度按时间x759pob21#
不能指望迭代器在插入后有效。
根据documentation:
如果新的
size()
大于旧的capacity()
,则导致重新分配。如果新的size()
大于capacity()
,则所有迭代器和引用都将无效。否则,只有插入点之前的迭代器和引用仍然有效。结尾后的迭代器也将无效。注意
insert
方法返回一个迭代器,这很重要,你可以使用它:这可能不是你唯一的问题,但这是一个开始。