Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: Проблема с операторами new и delete  (Прочитано 4184 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн aviacliff

  • Автор темы
  • Участник
  • *
  • Сообщений: 100
    • Просмотр профиля
Проблема с операторами new и delete
« : 01 Ноября 2014, 17:25:29 »
Всем доброго здоровья!

При попытке запустить алгоритм решения задачи Гаусса -Зейделя получил ошибку с применением операторов new и delete.

Для наглядности приведу пример от классика С++ Г. Шилдта, в котором симптомы одинаковые.

Работаю на системе: Ubuntu 12.04 LTS 32-bit
ядро: 3.8.0-44-generic #66~precise1-Ubuntu



/* Выделение памяти для массивов */

#include <stdio.h>
#include <string>
using namespace std;

int main()
{
        double *p;
int i;

         p = new double[10]; //выделение памяти

    for(i=0; i<10; i++)
    p[i]=100.0 + i;

    printf("p[%d]= %f\n", i, p[i]);

     delete [] p; //Удаление всего массива

   return 0;
}
[/font][/size]

Получаю ошибку от команды $ clang 1.cpp

/tmp/1-efda07.o: In function `main':
1.cpp:(.text+0x1e): undefined reference to `operator new[](unsigned int)'
1.cpp:(.text+0xa8): undefined reference to `operator delete[](void*)'
clang: error: linker command failed with exit code 1 (use -v to see invocation)
[/font][/size]

Приведу также более подробный вывод от команды $ clang -v 1.cpp

(Нажмите, чтобы показать/скрыть)
Если кто знает, где собака зарыта, подскажите.
За ранее спасибо.
Напоминаю, "UBUNTU" переводится как "ЧЕЛОВЕЧНОСТЬ"

Оффлайн Protopopulus

  • Старожил
  • *
  • Сообщений: 1694
  • А чего вы так смотрите?..
    • Просмотр профиля
Re: Проблема с операторами new и delete
« Ответ #1 : 01 Ноября 2014, 17:36:21 »
// #include <stdio.h> Это не Си, да и правильно будет <cstdio>
// #include <string> Здесь не используется

#include <iostream>
using namespace std;

int main()
{
    double *p;
    int i;

    p = new double[10]; //выделение памяти

    for(i=0; i<10; i++)
    p[i]=100.0 + i;

    // printf("p[%d]= %f\n", i, p[i]); Опять таки, не Си
    cout << "p[" << i << "] = " << p[i] << endl;

    // delete [] p; //Удаление всего массива (синтаксическая ошибка)
    delete[] p; // без пробела

    return 0;
}
Вроде бы, так.
Если ты владеешь знаниями, то и знания владеют тобой. (с) Protopopulus

Оффлайн aviacliff

  • Автор темы
  • Участник
  • *
  • Сообщений: 100
    • Просмотр профиля
Re: Проблема с операторами new и delete
« Ответ #2 : 01 Ноября 2014, 17:48:10 »
Перенес ваш исправленный код и получил

$ clang 2.cpp
/tmp/2-fb6137.o: In function `main':
2.cpp:(.text+0x1d): undefined reference to `operator new[](unsigned int)'
2.cpp:(.text+0x67): undefined reference to `std::cout'
2.cpp:(.text+0x79): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
2.cpp:(.text+0x88): undefined reference to `std::ostream::operator<<(int)'
2.cpp:(.text+0x9a): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
2.cpp:(.text+0xb3): undefined reference to `std::ostream::operator<<(double)'
2.cpp:(.text+0xb9): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)'
2.cpp:(.text+0xc5): undefined reference to `std::ostream::operator<<(std::ostream& (*)(std::ostream&))'
2.cpp:(.text+0xe5): undefined reference to `operator delete[](void*)'
/tmp/2-fb6137.o: In function `__cxx_global_var_init':
2.cpp:(.text.startup+0x10): undefined reference to `std::ios_base::Init::Init()'
2.cpp:(.text.startup+0x16): undefined reference to `std::ios_base::Init::~Init()'
clang: error: linker command failed with exit code 1 (use -v to see invocation)
[/font][/size]
Напоминаю, "UBUNTU" переводится как "ЧЕЛОВЕЧНОСТЬ"

Оффлайн Protopopulus

  • Старожил
  • *
  • Сообщений: 1694
  • А чего вы так смотрите?..
    • Просмотр профиля
Re: Проблема с операторами new и delete
« Ответ #3 : 01 Ноября 2014, 17:50:19 »
Очень интересно... А если не шлангом собрать, а ГЦЦ? Просто, такое на ГЦЦ собирается на раз-два.

UPD: Но вообще да, проблема с линкером, конечно. Возможно, надо просто ld попинать на предмет обновления путей.
« Последнее редактирование: 01 Ноября 2014, 17:55:57 от Protopopulus »
Если ты владеешь знаниями, то и знания владеют тобой. (с) Protopopulus

Оффлайн aviacliff

  • Автор темы
  • Участник
  • *
  • Сообщений: 100
    • Просмотр профиля
Re: Проблема с операторами new и delete
« Ответ #4 : 01 Ноября 2014, 18:07:15 »
gcc дает такой же результат

если вот такой код то выдает одну ошибку

//#include <iostream>
#include <cstdio.h>
//using namespace std;

int main()
{
    double *p;
    int i;

    p = new double[10]; //выделение памяти

    for(i=0; i<10; i++)
    p[i]=100.0 + i;

    printf("p[%d]= %f\n", i, p[i]); //Опять таки, не Си
    //cout << "p[" << i << "] = " << p[i] << endl;

    // delete [] p; //Удаление всего массива (синтаксическая ошибка)
    delete[] p; // без пробела

    return 0;
}
[/font][/size]


$ clang 2.cpp
2.cpp:5:10: fatal error: 'cstdio.h' file not found
#include <cstdio.h>
         ^
1 error generated.
[/font][/size]
Напоминаю, "UBUNTU" переводится как "ЧЕЛОВЕЧНОСТЬ"

Оффлайн Protopopulus

  • Старожил
  • *
  • Сообщений: 1694
  • А чего вы так смотрите?..
    • Просмотр профиля
Re: Проблема с операторами new и delete
« Ответ #5 : 01 Ноября 2014, 18:14:59 »
Не <cstdio.h>, а <cstdio>. Все сишные заголовки записываются как "<cheader>" и не имеют постфикса ".h". И да, все же, рекомендую использовать плюсовую запись и не смешивать ее с сишной. Проблема таки не в синтаксисе, а в линкере, с ним надо бы разобраться.
Если ты владеешь знаниями, то и знания владеют тобой. (с) Protopopulus

Оффлайн aviacliff

  • Автор темы
  • Участник
  • *
  • Сообщений: 100
    • Просмотр профиля
Re: Проблема с операторами new и delete
« Ответ #6 : 01 Ноября 2014, 19:56:27 »
Protopopulus спасибо, на сегодня достаточно.

Пользователь решил продолжить мысль [time]01 Ноябрь 2014, 23:16:29[/time]:
Посмотрел свои старые записи и нашел следующее
Записи компилятора
1.cpp:(.text+0x1e): undefined reference to `operator new[](unsigned int)'
1.cpp:(.text+0xa8): undefined reference to `operator delete[](void*)'


говорят, что таких функций (операторов) нет в главной функции, как они написаны, компилятор их не видит, а почему - это вопрос.

Пользователь решил продолжить мысль 02 Ноября 2014, 00:13:26:
Нужно делать через команду

g++ 2.cpp[/font][/size][/size]

Все покатило как по маслу!!!
« Последнее редактирование: 02 Ноября 2014, 00:13:26 от aviacliff »
Напоминаю, "UBUNTU" переводится как "ЧЕЛОВЕЧНОСТЬ"

 

Страница сгенерирована за 0.037 секунд. Запросов: 25.