Tôi chạy vào một đống tham nhũng ngày hôm nay gây ra bởi các thiết lập CRT khác nhau (MTd MDd) trong dll của tôi và dự án thực tế của tôi. Điều tôi thấy lạ là ứng dụng chỉ gặp sự cố khi tôi đặt trình phá hủy trong dll thành ảo. Có một lời giải thích dễ dàng cho điều đó không? Tôi nhận được rằng tôi không thể giải phóng bộ nhớ mà không phải trên heap của tôi, nhưng nơi chính xác là sự khác biệt khi tôi xác định destructor là phi ảo.CRT destructor ảo
Một số luật chỉ để làm cho nó rõ ràng hơn một chút
Các DLL
#pragma once
class CTestClass
{
public:
_declspec(dllexport) CTestClass() {};
_declspec(dllexport) virtual ~CTestClass() {};
};
Và dự án của tôi
int main(int argc, char* argv[])
{
CTestClass *foo = new CTestClass;
delete foo; // Crashes if the destructor is virtual but works if it's not
}
Đồng thời, bạn có cùng một vấn đề hay không bằng cách di chuyển declspec sang lớp * * ('lớp _declspec (dllexport) CTestClass {...}') và loại bỏ các declspecs mỗi thành viên? Chỉ tò mò thôi. Và lưu ý, các mã gọi và DLL nên được sử dụng cùng một CRT (gỡ lỗi hoặc phát hành), do đó thats cái gì để xem xét. Tôi thậm chí không chắc chắn chế độ hỗn hợp được hỗ trợ (tôi không nghĩ rằng nó là). – WhozCraig
Bạn có nhiều bản sao của CRT trong quá trình của bạn. Và bạn chỉ xuất các phương thức lớp chứ không phải bảng v. Cố gắng giải thích cách tất cả điều này tương tác với việc đánh bom mã của bạn không hiệu quả như thế nào.Việc xuất một lớp với các phương thức ảo yêu cầu bạn xuất toàn bộ lớp, đặt __declspec (dllexport) bên cạnh từ khóa * class *. Và bạn phải đảm bảo một bộ cấp phát đơn được sử dụng để tạo và phá hủy đối tượng. Rất khó đảm bảo trừ khi bạn xây dựng với/MD một cách nhất quán và sử dụng cùng một phiên bản trình biên dịch chính xác. Việc trưng ra các lớp C++ trên các ranh giới mô-đun chỉ là nguy hiểm. –
Bạn đang có quyền, ngay cả khi tôi tìm ra lý do tại sao nó không hoạt động, nó sẽ không giúp tôi quá nhiều. Cảm ơn anyway cho những suy nghĩ của bạn :) – Poisonbox