Cpp

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Cpp

Сообщение ANDLL » 14.01.2005 (Пт) 16:08

Может кому-то покажеться не в тему, но все-же:
API-функция возвращает в VB строку таким образом:
Код: Выделить всё
return (long)SysAllocStringByteLen(Value,strlen(Value));

Где в Value содержиться ANSI-строка.
В VB ф-ция объявлена As String. Вопрос: Basic будет САМ удалять строку из памяти или нет?
И еще: как я понимаю, SysAllocStringByteLen автоматически преобразует строку ANSI в Unicode?

Ну и еще:
Код: Выделить всё
   string a;
   a="aaabbb";
   LPSTR b;
   b=new char[];
   strcpy(b,a.begin());
   MessageBox(0,b,"Загаловок",0);
   delete b;

Почему программа вылетает на последней строке?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 15.01.2005 (Сб) 4:07

1. Да, будет.
2. Нет, он копирует то, что ему дают. Полученная строка будет ANSI (и это правильно, т.к. VB ожидает от As String-функции именно ANSI-строку.)
3. Может, из-за ошибки в слове "Заголовок"? ;-)
На самом деле, имхо там надо delete[] b;
Изображение

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 16.01.2005 (Вс) 11:16

ТАК, Темыч я тут чего-то не понял. Объясни, пожалуйста.
Чем отличается delete от delete [] :?: Я так понимаю: существуют функции malloc и free.
malloc принимает в качестве параметра размер блока и возвращает адрес первого байта этого блока.
free принимает в качестве параметра адрес первого байта блока, и удаляет ВЕСЬ(:!:) блок. Информация о размере блока храниться в системной памяти.
Проверяем:
Код: Выделить всё
void main()
{
   cout<<"Run...\n";
   long*ptr1;long*ptr2;
   cout<<"Test1...";
   ptr1=new long[5];
   ptr1[1]=10;
   delete ptr1;//Создаем и удаляем блок из шести DWORD
   cout<<"OK\n";

   cout<<"Test2...";
   ptr2=new long[5];//Создаем блок из шести DWORD
   ptr2++;// Смещаем указатель на 1 DWORD
   delete ptr2;//Удаляем блок из шести DWORD//O-ops...
   cout<<"OK\n";

   cout<<"Test3...";
   ptr1++;//Убедимся, что все элементы ptr1 были удалены
   *ptr1=15;
   cout<<(*ptr1);//Действительно, вы получите либо access violation, либо не 15
   cout<<"OK\n";
}


Оператор new вызывает malloc, используя sizeof(type) и вызывают конструтор класса, если он есть.
Оператор delete вызывает деструктор класса, если он есть, и вызывает free.
Так как у простых типов нет конструкторов класса, new и malloc, delete и free, полность аналогичны.
Таким образом: если выделять количество байт, указанное в a.size(), и копировать, используя strncpy, то все работает.
А вот код, приведенный мною и не должен работать.
Правильно?
Однако, примеры такого кода я где-то встречал... И там нету strncpy
:?: :?: :?:
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 16.01.2005 (Вс) 15:42

ANDLL писал(а):ТАК, Темыч я тут чего-то не понял. Объясни, пожалуйста.
Чем отличается delete от delete []

Про это (и про твою ошибку ;-)) у Рэймонда Чена есть целая статья: http://weblogs.asp.net/oldnewthing/arch ... 66660.aspx

ANDLL писал(а): :?: Я так понимаю: существуют функции malloc и free.
malloc принимает в качестве параметра размер блока и возвращает адрес первого байта этого блока.
free принимает в качестве параметра адрес первого байта блока, и удаляет ВЕСЬ(:!:) блок. Информация о размере блока храниться в системной памяти.

Да, но malloc/free из одной оперы, а new/delete из другой. Сомневаюсь, что их можно мешать в кашу.

Скорее всего, new/delete, являясь операциями "более высокого" уровня, делают ещё какую-то дополнительную закулисную работу, кроме просто выделения памяти.
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 16.01.2005 (Вс) 15:43

По чему ты учился C++? :)

Wrox Press C++ Tutorial писал(а):Allocating memory for an array dynamically is very straightforward. If we wanted to allocate an array of type char, assuming pstr is a pointer to char, we could write the following statement:
Код: Выделить всё
pstr = new char[20];  // Allocate a string of twenty characters


This allocates space for a char array of 20 characters and stores its address in pstr.

To remove the array that we have just created in the free store, we must use the delete operator. The statement would look like this:
Код: Выделить всё
delete [] pstr;          // Delete array pointed to by pstr


Note the use of square brackets to indicate that what we are deleting is an array. When removing arrays from the free store, you should always include the square brackets or the results will be unpredictable. Note also that you do not specify any dimensions here, simply [].
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 70

    TopList  
cron