【问题标题】:Populating map with new pointers in a loop (C++)在循环中使用新指针填充映射(C++)
【发布时间】:2019-11-15 06:49:30
【问题描述】:

所以我正在处理来自 leetcode 的 Copy List with Random Pointer 问题并遇到了一些问题。

for (; iterateOG->next != nullptr; 
     iterateOG = iterateOG->next) {
    Node* tmp = new Node;
    hashTable.insert(std::pair<Node*,Node*>(iterateOG,tmp));
}

所以我想为原始列表中的每个现有节点创建一个新的 Node 对象。运行测试用例后,我收到一条错误消息,例如下面的提示

'hashTable' &lt;== Memory access at offset 912 overflows this variable
HINT: this may be a false positive if your program uses some custom stack unwind mechanism or swapcontext
      (longjmp and C++ exceptions *are* supported)

有谁知道是什么导致了这个问题?我知道原因可能是因为我创建了一个新对象并且在范围内没有对它做任何事情,但我没有看到解决这个问题的方法。任何帮助,将不胜感激。谢谢!

完整代码错误信息如下

/*
// Definition for a Node.
class Node {
public:
    int val;
    Node* next;
    Node* random;

    Node() {}

    Node(int _val, Node* _next, Node* _random) {
        val = _val;
        next = _next;
        random = _random;
    }
};
*/
class Solution {
public:
    Node* copyRandomList(Node* head) {
        if (head == nullptr)
            return nullptr;

        Node* iterateOG = head;
        std::map<Node*, Node*> hashTable;

for (; iterateOG->next != nullptr; 
     iterateOG = iterateOG->next) {
    Node* tmp = new Node;
    hashTable.insert(std::pair<Node*,Node*>(iterateOG,tmp));
}
        std::cout << endl;

        iterateOG = head;

        for (; iterateOG->next != nullptr; 
             iterateOG = iterateOG->next) {
            hashTable.find(iterateOG)->second->val = iterateOG->val;
            hashTable.find(iterateOG)->second->next = hashTable.find(iterateOG->next)->second;
            hashTable.find(iterateOG)->second->random = hashTable.find(iterateOG->random)->second;
            std::cout << hashTable.find(iterateOG)->second->val << ',';
        }
        std::cout << endl;

        return hashTable.find(head)->second;
    }
};

错误信息

=================================================================
==29==ERROR: AddressSanitizer: stack-buffer-overflow on address 0x7ffc4dbbbb70 at pc 0x00000041d7eb bp 0x7ffc4dbbb7b0 sp 0x7ffc4dbbb7a8
READ of size 8 at 0x7ffc4dbbbb70 thread T0
    #2 0x7fa042ca92e0 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x202e0)
Address 0x7ffc4dbbbb70 is located in stack of thread T0 at offset 912 in frame
  This frame has 14 object(s):
    [32, 33) '__c'
    [96, 97) '__c'
    [160, 168) 'iterateOG'
    [224, 232) 'tmp'
    [288, 296) '&lt;unknown&gt;'
    [352, 360) '&lt;unknown&gt;'
    [416, 424) '&lt;unknown&gt;'
    [480, 488) '&lt;unknown&gt;'
    [544, 552) '&lt;unknown&gt;'
    [608, 616) '&lt;unknown&gt;'
    [672, 680) '&lt;unknown&gt;'
    [736, 744) 'head'
    [800, 816) '&lt;unknown&gt;'
    [864, 912) 'hashTable' &lt;== Memory access at offset 912 overflows this variable
HINT: this may be a false positive if your program uses some custom stack unwind mechanism or swapcontext
      (longjmp and C++ exceptions *are* supported)
Shadow bytes around the buggy address:
  0x100009b6f710: 00 f2 f2 f2 f2 f2 f2 f2 f8 f2 f2 f2 f2 f2 f2 f2
  0x100009b6f720: f8 f2 f2 f2 f2 f2 f2 f2 00 f2 f2 f2 f2 f2 f2 f2
  0x100009b6f730: 00 f2 f2 f2 f2 f2 f2 f2 00 f2 f2 f2 f2 f2 f2 f2
  0x100009b6f740: 00 f2 f2 f2 f2 f2 f2 f2 00 f2 f2 f2 f2 f2 f2 f2
  0x100009b6f750: 00 f2 f2 f2 f2 f2 f2 f2 00 f2 f2 f2 f2 f2 f2 f2
=&gt;0x100009b6f760: f8 f8 f2 f2 f2 f2 f2 f2 00 00 00 00 00 00[f2]f2
  0x100009b6f770: f3 f3 f3 f3 00 00 00 00 00 00 00 00 00 00 00 00
  0x100009b6f780: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x100009b6f790: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x100009b6f7a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x100009b6f7b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
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
==29==ABORTING

【问题讨论】:

  • 你的默认Node构造函数需要初始化你的变量

标签: c++ loops dictionary pointers new-operator


【解决方案1】:

错误在这一行:

hashTable.find(iterateOG)->second->next = hashTable.find(iterateOG->next)->second;

对于最后一个节点 iterateOG-&gt;next 的值不在 hashTable 中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-14
    • 2019-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多