информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Все любят медАтака на InternetЗа кого нас держат?
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 На GitHub пугают ложными предупреждениями... 
 Атака на пользователей больших... 
 Notepad++ полгода раздавал зараженные... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Совет на будующее, авось пригодится 11.01.02 00:55  Число просмотров: 1026
Автор: PS <PS> Статус: Elderman
<"чистая" ссылка>
SDK решает все проблеммы.
Вот маленький примерчик из него:
const CString& CString::operator=(const CString& stringSrc)
{
if (m_pchData != stringSrc.m_pchData)
{
if ((GetData()->nRefs < 0 && GetData() != _epDataNil)|
stringSrc.GetData()->nRefs < 0)
{
// actual copy necessary since one of the strings is locked
AssignCopy(stringSrc.GetData()->nDataLength, stringSrc.m_pchData);
}
else
{
// can just copy references around
Release();
m_pchData = stringSrc.m_pchData;
InterlockedIncrement(&GetData()->nRefs);
}
}
return *this;
}
<programming>
[C++] Вопрос про CString (для профессионалов) 08.01.02 21:41  
Автор: Serus Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Я програмирую на MS Visual C++ 6.0

Меня интересует, как будет распределятья память в следующем случае.

{
....
CString sText;
sText = pszData; //ну например, 10 Мб
funck(sText);
.....
}

void funck(CString sText)
{
...
//Какие-нибудь операции с sText
...
}

Вопрос N1:
При вызове функции funck будет ли выделяться еще 10 Мб памяти?
Если да то где (на стеке или нет)?
Вопрос N2:
Как передается содержимое sText в функцию funck (через стек или через указатель)?
Вопрос N3:
После выхода из funk изменится ли содержимое sText?

Заранее спасибо!!!
Совет на будующее, авось пригодится 11.01.02 00:55  
Автор: PS <PS> Статус: Elderman
<"чистая" ссылка>
SDK решает все проблеммы.
Вот маленький примерчик из него:
const CString& CString::operator=(const CString& stringSrc)
{
if (m_pchData != stringSrc.m_pchData)
{
if ((GetData()->nRefs < 0 && GetData() != _epDataNil)|
stringSrc.GetData()->nRefs < 0)
{
// actual copy necessary since one of the strings is locked
AssignCopy(stringSrc.GetData()->nDataLength, stringSrc.m_pchData);
}
else
{
// can just copy references around
Release();
m_pchData = stringSrc.m_pchData;
InterlockedIncrement(&GetData()->nRefs);
}
}
return *this;
}
[C++] Вопрос про CString (для профессионалов) 09.01.02 01:08  
Автор: LiNX Статус: Незарегистрированный пользователь
<"чистая" ссылка>
1. В примере присутсвует неудачное, имхо, повторение sText, из-за чего плохо воспринимается суть происходящего.
2. Структура класса CString такова, что он состоит из одного LPTSTR m_pchData указателя на буфер - и больше ничего ! (не считая функций, конечно же), а потому память всего класса 32 бита.
3. Класс CString очень хитро построен : при передаче параметров по значению (32 бита) используется тот же самый объект в памяти, что и для исходного CString, поэтому, на первый взгляд, изменения внутри функции должны влиять на исходный объект ,- в реальности это не так. При обращении к объекту в функции, строится новый буфер с данными (в куче), с которым и происходит работа (при выходе из области видимости деструктор уничтожает этот объект). В структуре, на которую ссылается LPTSTR m_pchData существует счетчик подобных ссылок.

Т.о.:
1. При вызове функции funck память (10 Мб) выделена не будет. Память будет выделена при первой попытке записи (будут использваны переопределенные операторы), и выделена память будет в куче (при том, что "сам CString" сидит в стеке (если не задействована специальная оптимизация - тогда он будет в регистре)).
2. sText передается через стек (32 бита) (по значению (существует передача по значению или по адресу(указателю) - они все передаются через стек (кроме см п. 1))
3. После выхода значение sText не изменится, т. к. передача происходила по значению, а если бы происходила по ссылке(адресу, const_указателю), то значение можно менять.

ЗЫ: необходимо учитывать, что CString - это класс, который может быть реализован при желании и по другому.
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2026 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach