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





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[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