Действительно ли полезно протестировать возврат “новых” в C++?

Я понял это с помощью небольшой математики. Поймай все события, которые происходят на верхнем круге. Если в качестве события указана мышь, она перемещена или завершена, проверьте, находится ли мышь внутри нижнего круга.

import java.util.Random;
import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.event.EventType;
import javafx.scene.Scene;
import javafx.scene.control.CheckBox;
import javafx.scene.input.MouseButton;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;

/**
 *
 * @author blj0011
 */
public class JavaFXApplication349 extends Application
{

    private final Random RND = new Random();
    Circle bottomCircle = new Circle(150, 150, 100, Color.BLUE);
    Circle topCircle = new Circle(200, 100, 40, randColor());

    MouseEvent enteredBottomCircle = new MouseEvent(MouseEvent.MOUSE_ENTERED, bottomCircle.getLayoutX(), bottomCircle.getLayoutY(), bottomCircle.getLayoutX(), bottomCircle.getLayoutY(), MouseButton.NONE, 1, true, true, true, true, true, true, true, true, true, true, null);
    MouseEvent exitedBottomCircle = new MouseEvent(MouseEvent.MOUSE_EXITED, bottomCircle.getLayoutX(), bottomCircle.getLayoutY(), bottomCircle.getLayoutX(), bottomCircle.getLayoutY(), MouseButton.NONE, 1, true, true, true, true, true, true, true, true, true, true, null);

    @Override
    public void start(Stage stage) throws Exception
    {

        bottomCircle.fillProperty().bind(Bindings.when(bottomCircle.hoverProperty()).then(Color.AQUA).otherwise((Color.BLUE)));

        topCircle.addEventHandler(EventType.ROOT, (event) -> {
            System.out.println(event.getEventType());

            if (event.getEventType() == MouseEvent.MOUSE_ENTERED || event.getEventType() == MouseEvent.MOUSE_MOVED || event.getEventType() == MouseEvent.MOUSE_EXITED) {
                MouseEvent event1 = (MouseEvent) event;

                if (Math.sqrt(Math.pow((event1.getSceneX() - bottomCircle.getCenterX()), 2) + Math.pow((event1.getSceneY() - bottomCircle.getCenterY()), 2)) < bottomCircle.getRadius()) {
                    System.out.println("entered bottom circle");
                    bottomCircle.fireEvent(enteredBottomCircle);
                }

                else {
                    System.out.println("exited bottom circle");
                    bottomCircle.fireEvent(exitedBottomCircle);
                }
            }

        });

        topCircle.setOnMouseClicked((event) -> topCircle.setFill(randColor()));

        CheckBox mouseTransparencyCheckBox = new CheckBox("Top Circle Mouse Transparency");
        topCircle.mouseTransparentProperty().bind(mouseTransparencyCheckBox.selectedProperty());

        Pane pane = new Pane();
        pane.setPrefSize(300, 300);
        pane.getChildren().addAll(mouseTransparencyCheckBox, bottomCircle, topCircle);

        Scene scene = new Scene(pane);
        stage.setScene(scene);
        stage.show();
    }

    private Color randColor()
    {
        return Color.hsb(RND.nextDouble() * 360, 1, 1, 0.75);
    }

    public static void main(String[] args)
    {
        launch(args);
    }

}
24
задан Guid 27 October 2008 в 08:00
поделиться

6 ответов

Согласно текущему стандарту, новый никогда возвраты ПУСТОЙ УКАЗАТЕЛЬ , это бросает станд.:: bad_alloc вместо этого. Если Вы не хотите в новинку для броска (согласно старому стандарту), а скорее возвращаете ПУСТОЙ УКАЗАТЕЛЬ, необходимо назвать его путем добавления постфикса его" (станд.:: nothrow) ". т.е.

Foo* foo = new (std::nothrow) Foo;

, Конечно, если у Вас есть очень старое или возможно поврежденный набор инструментальных средств, он не мог бы следовать стандарту.

46
ответ дан 28 November 2019 в 22:41
поделиться

Все это зависит от Вашего VC компилятора ++ до версии 6, дает ПУСТОЙ УКАЗАТЕЛЬ, если новый оператор перестал работать на не приложении MFC.

Теперь проблема становится больше при использовании, например, STL с VC ++ 6 потому что STL идет со стандартами, которые это никогда не будет тестировать на ПУСТОЙ УКАЗАТЕЛЬ, когда он должен будет получить некоторую память и предположить то, что произойдет при низких условиях памяти....

Так для всех, которые все еще используют VC ++ 6 и STL, проверяют эту статью на Фиксацию. не Позволяют Катастрофическому отказу Сбоев выделения памяти Ваше Приложение

STL Прежней версии
7
ответ дан 28 November 2019 в 22:41
поделиться

Все это зависит, для какой версии C++ код предназначается. Спецификация C++ в течение долгого времени теперь указала, что, по умолчанию по крайней мере, отказы в новом вызовут исключение C++, таким образом, любой код, выполняющий тест, был бы совершенно избыточен. Большая часть программирования в наше время также предназначается для операционных систем с виртуальной памятью, где его почти невозможный исчерпать память, И условие из памяти является столь фатальным так или иначе, что просто разрешение сбою приложения на следующем ПУСТОМ доступе является столь же хорошим способом любого завершения.

Ее единственное действительно во встроенном программировании, где обработка исключений, как считают, является слишком большим количеством издержек, и память очень ограничена, который программисты потрудились проверять на новые отказы.

4
ответ дан 28 November 2019 в 22:41
поделиться

Как заключено в кавычки здесь

"В компиляторах, соответствующих стандарту C++ ISO, если существует недостаточно памяти для выделения, код выдает исключение станд. типа:: bad_alloc. Весь последующий код прерывается, пока ошибка не обрабатывается в блоке try-catch, или программа выходит неправильно. Программа не должна проверять значение указателя; если никакое исключение не было выдано, выделение, за которым следуют".

3
ответ дан 28 November 2019 в 22:41
поделиться
  1. new броски std::bad_alloc по умолчанию. Если Вы используете значение по умолчанию, проверяющий на пустой указатель является устаревшим, но обрабатывающие исключения необходимы. Это поведение по умолчанию согласовывается с парадигмой безопасности исключения C++ - это обычно обеспечивает, что объект или создается или не выделил

  2. при переопределении значения по умолчанию при помощи new (std::nothrow) проверение пустого указателя необходимо. "Новый" и выделяет и фиксирует страницы, таким образом, возможно исчерпать память, или потому что у Вас закончились дескрипторы страницы, или потому что нет никакой физической памяти, доступной

  3. , исследуют управление памятью Вашей ОС. Ссылочная машина C/C++ не знает, как Ваша ОС управляет памятью, таким образом полагаться на один только язык не безопасно. Например, разложенного выделения памяти, читайте на C malloc() +, Linux принимает на себя непосильные обязательства

3
ответ дан 28 November 2019 в 22:41
поделиться

Обычно никто не тестирует возврат новых в новом коде, потому что Visual Studio теперь бросает способ, которым говорится в стандарте.

В старом коде, если взлом был сделан, чтобы не бросать тогда, необходимо протестировать.

0
ответ дан 28 November 2019 в 22:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: