Tôi không biết tại sao điều này không hoạt động. Function
sau được tạo bởi vị trí mới. Một hàm được cung cấp để kiểm tra xem nó có bị hủy hay không và nếu có, hãy gọi hàm hủy của nó theo cách thủ công.Thiết bị hủy không được gọi sau khi phá hủy đối tượng được sắp xếp mới
Đây là testcase nơi có vẻ như destructor không bao giờ được gọi là:
/* Represents a function at runtime */
class Function {
public:
/* Creates an invalid function */
Function():codeptr(0) { }
/* Creates a function with the given code pointer */
Function(void *codeptr):codeptr(codeptr) { }
/* Frees the function machine code */
~Function() {
if(*this) {
/* <- I explicitly put a debug output here! */
destroyLLVMCode(codeptr);
}
}
public:
/* Returns true if the function is valid
* (if the code pointer is non-null)
*/
operator bool() const { return codeptr != 0; }
/* Destroy this function by calling its destructor */
void destroy() { ~Function(); }
private:
void *codeptr;
};
Tôi sử dụng này như sau. Cắt giảm mã dưới đây xuống mức tối thiểu vẫn còn hiện ra vấn đề. Trong chương trình thực sự của tôi, tất nhiên, bộ nhớ được phân bổ theo cách khác, từ một cấp phát.
#include <new>
#include <cstdlib>
int main() {
void *buffer = std::malloc(sizeof(Function));
Function *f = new (buffer) Function(someExecutableLLVMCode);
/* more code .. register with symbol tables etc.. */
f->destroy();
}
Bạn có thể thấy tôi đang gọi hàm hủy trong dòng đọc ~Function()
. Trình biên dịch chấp nhận, nhưng nó không kết thúc bằng cách gọi nó: tôi đã xác minh nó bằng cách kiểm tra xem nó có thực sự xóa mã LLVM mà tôi đã cung cấp hay không (đặt một số mã vào trình phá hủy trước khi xóa mã LLVM mà codeptr
trỏ tới, trong trường hợp Function
hợp lệ).
Tôi đã tìm hiểu sau về những gì đang gây ra điều đó. Bạn có thể vui lòng cung cấp cho tôi một lời giải thích?
Mã này không bao giờ tạo một hàm theo bất kỳ cách nào và không bao giờ gọi bất kỳ phương thức nào, vì vậy nó không ngạc nhiên khi nó cũng không bao giờ phá hủy bất kỳ đối tượng hàm nào ... –
@Johannes, làm thế nào để bạn tạo cá thể ở đây? Vị trí đó 'mới' ở đâu? –
@Johannes: nghỉ ngơi, ngủ trưa, bất cứ điều gì. ;-) ví dụ mã của bạn không minh họa sự cố. bạn đang nói bạn đã tìm ra nguyên nhân nhưng bạn đang yêu cầu giải thích. điều này chỉ là lộn xộn. bạn có thể xóa câu hỏi và đăng bài vào ngày mai không? –