ошибка при работе с CDBVariant?
От: Alex  
Дата: 09.08.01 06:46
Оценка:
Привет всем!

Не скажу, что я крут в С++, но сам уже разобраться в проблеме не могу. Подскажите, пожалуйста, где я ошибся:
(создано из VC++ 6, как консольное приложение с поддержкой MFC)

#include "stdafx.h"
#include "test4.h"
#include "afxdb.h"


class CItem
{
public:
CItem();
virtual ~CItem();

void SetValue(CDBVariant fieldValue);
private:
CDBVariant value;
};

CItem::CItem(){}

CItem::~CItem(){}

void CItem::SetValue(CDBVariant fieldValue)
{
value = fieldValue;
}

/////////////////////////////////////////////////////////////////////////////
// The one and only application object

CWinApp theApp;

using namespace std;

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
// initialize MFC and print and error on failure
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: change error code to suit your needs
cerr << _T("Fatal Error: MFC initialization failed") << endl;
nRetCode = 1;
}
else
{
// TODO: code your application's behavior here.



// это мой код !
CItem item;
for (int i = 0; i < 10; i++) {
CDBVariant value;
value.m_dwType = DBVT_STRING;
value.m_pstring = new CString("10.8");
// value.m_dwType = DBVT_DOUBLE; // а вот если эти две строчки раскомментировать, а верхние две закомментировать,
// value.m_dblVal = 10.8; // то все работает без ошибок!!!
item.SetValue(value);
} // ПАДАЕТ ВОТ НА ЭТОМ МЕСТЕ!!!!



cout << "Ok" << endl;


}
return nRetCode;
}
Re: ошибка при работе с CDBVariant?
От: Alex Ostapenko Россия  
Дата: 10.08.01 06:24
Оценка:
Здравствуйте Alex, вы писали:

A>Не скажу, что я крут в С++, но сам уже разобраться в проблеме не могу. Подскажите, пожалуйста, где я ошибся:

A>(создано из VC++ 6, как консольное приложение с поддержкой MFC)

A>void CItem::SetValue(CDBVariant fieldValue)

A>{
A> value = fieldValue;
A>}

A> CItem item;

A> for (int i = 0; i < 10; i++) {
A> CDBVariant value;
A> value.m_dwType = DBVT_STRING;
A> value.m_pstring = new CString("10.8");
A>// value.m_dwType = DBVT_DOUBLE; // а вот если эти две строчки раскомментировать, а верхние две закомментировать,
A>// value.m_dblVal = 10.8; // то все работает без ошибок!!!
A> item.SetValue(value);
A> } // ПАДАЕТ ВОТ НА ЭТОМ МЕСТЕ!!!!

В общем, рискну предположить что фишка в следующем:
У CDBVariant'а нет copy-конструктора, поэтому твое присваивание приводит к простому копированию памяти. После чего у тебя получается 2 указателя на один и тот же CString, что приводит к попытке двойного его освобождения.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.