Khi gỡ lỗi với GDB, tôi muốn đặt một biến tiện lợi thành giá trị mới được xây dựng.Cách gọi hàm tạo trong gdb cho các máy in đẹp
Tôi đang lập trình bằng cách sử dụng khung Qt, vì vậy tôi muốn tạo một QString, nhưng điều này không liên quan đến câu hỏi, vì tôi muốn biết cách làm điều này với bất kỳ lớp nào.
tôi đã cố gắng
(gdb) set $str = 'QString::QString("abc")'
No symbol "QString::QString("abc")" in current context.
(gdb) set $str = QString::QString("abc")
Cannot resolve method QString::QString to any overloaded instance
(gdb) set $str = QString("abc")
A syntax error in expression, near `("abc")'.
sau đó tôi cố gắng sử dụng set overload-resolution off
, kết quả như sau:
set $str = QString::QString("abc")
non-unique member `QString' requires type instantiation
set $str = 'QString::QString(const char*)'("abc")
Too few arguments in function call.
Vì vậy, tôi cho rằng một con trỏ này là cần thiết:
(gdb) set $str = 'QString::QString(const char*)'(malloc(sizeof(QString)), "abc")
(gdb) p $str
$8 = void
Được rồi, nhà thầu return void, điều đó có nghĩa là tôi phải lưu giá trị trả về của malloc ở đâu đó:
(gdb) set $pointer = malloc(sizeof(QString))
(gdb) p $pointer
$9 = 6304560
(gdb) p/x $pointer
$10 = 0x603330
(gdb) set $str = 'QString::QString(const char*)'($pointer, "abc")
(gdb) p $str
$11 = void
(gdb) p $pointer
$12 = 6304560
(gdb) p *((QString*)$pointer)
$13 = "abc"
Được rồi, bây giờ điều này hoạt động như mong đợi, tuy nhiên tôi muốn sử dụng mã này trong gdb.parse_and_eval() cho máy in đẹp trăn. Bây giờ điều này sẽ gọi malloc rất nhiều lần, tạo ra một rò rỉ bộ nhớ. Vì vậy, chỉ cần gọi miễn phí()? Hiện tại, điều bất ngờ xảy ra:
(gdb) call free($pointer)
$14 = 0
(gdb) p *((QString*)$pointer)
$15 = "abc"
Con trỏ vẫn có vẻ hợp lệ, vì bộ nhớ không được sử dụng lại. Tuy nhiên tôi không chắc liệu điều này có ổn không vì sau khi phân bổ thêm một vài khối bộ nhớ phù hợp với chính xác một giá trị con trỏ QString vẫn chưa được sử dụng lại bởi malloc.
Tôi có tạo ra rò rỉ bộ nhớ lớn nếu tôi sử dụng nó trong một máy in khá hay, có thể được gọi rất nhiều lần trong một phiên gỡ lỗi? Có giải pháp nào dễ dàng hơn trong việc tạo kết quả mong muốn (tức là sử dụng API Python) không?
Cũng không liên quan đến điều này, tại sao miễn phí (3) cho tôi giá trị trả lại là 0 trong khi thực sự bị vô hiệu?