Skip to main content

DYNAMIC OBJECTS: Creating and Deleting

 Key Points:

  • Dynamic Objects: Objects created during program execution using the new operator. They reside on the heap (free store) and have separate lifetimes from the code that manages them.
  • new Operator: Allocates memory on the heap, returns a pointer to the newly allocated block, and initializes the object (if a constructor exists).
  • delete Operator: Deallocates memory pointed to by a pointer, reclaiming it for future use. It's crucial to use delete on dynamic objects to avoid memory leaks.
  • Pointers: Essential for managing dynamic objects, as they store the memory addresses of these objects.

Example:

C++
#include <iostream>

class Point {
public:
    int x, y;

    Point() : x(0), y(0) {} // Default constructor

    void setValues(int x, int y) {
        this->x = x;
        this->y = y;
    }

    void print() const {
        std::cout << "(" << x << ", " << y << ")" << std::endl;
    }

    ~Point() { // Destructor, called automatically when a Point object goes out of scope
        std::cout << "Point at (" << x << ", " << y << ") destroyed." << std::endl;
    }
};

int main() {
    // Create a dynamic Point object on the heap
    Point* p = new Point();

    // Access and modify its members
    p->setValues(3, 5);
    p->print();  // Output: (3, 5)

    // Call a member function
    p->doSomething(); // Assuming Point has a doSomething() method

    // Delete the object, freeing the allocated memory
    delete p;

    return 0;
}

Explanation:

  1. Class Point: Encapsulates data (x, y) and behaviors (constructor, setValuesprint, and potentially doSomething).
  2. new Point(): Allocates memory for a Point object on the heap, initializes it using the default constructor (or a user-provided one), and returns a pointer (p) to it.
  3. Pointer Access: Use -> to access members of dynamic objects pointed to by the pointer.
  4. delete p;: Frees the memory pointed to by p, preventing memory leaks.
  5. Destructor: Automatically called when a dynamic object goes out of scope, cleaning up resources (usually virtual destructors in inheritance hierarchies).

Best Practices:

  • Initialize Dynamic Objects: Use constructors to ensure a well-defined state.
  • Delete All Dynamic Objects: Ensure delete is called for each new to avoid leaks.
  • Smart Pointers: Consider using smart pointers (like std::unique_ptrstd::shared_ptr) to manage pointer lifecycles automatically.
  • Rule of Three/Five: Follow the Rule of Three/Five for destructors, copy constructors, and copy assignment operators when managing resources in classes.

Comments

Popular posts from this blog

C++ Variable

C++ Variables: Named Storage Units In C++, variables serve as named boxes in memory that hold values during program execution. Each variable has three key aspects: 1. Data Type: Defines the kind of data a variable can store: numbers (integers, floating-point, etc.), characters, boolean values (true/false), or custom data structures (arrays, objects). Common data types: int : Whole numbers (e.g., -10, 0, 23) float : Decimal numbers (e.g., 3.14, -2.5) double : More precise decimal numbers char : Single characters (e.g., 'a', 'Z', '&') bool : True or false values 2. Name: A user-defined label for the variable, chosen according to naming conventions: Start with a letter or underscore. Contain letters, digits, and underscores. Case-sensitive (e.g.,  age  and  Age  are different). Not a reserved keyword (e.g.,  int ,  for ). Choose meaningful names that reflect the variable's purpose. 3. Value: The actual data stored in the variable, which must match its data...

C++ Functions

C++ Functions A function is a block of code that performs a specific task. Suppose we need to create a program to create a circle and color it. We can create two functions to solve this problem: a function to draw the circle a function to color the circle Dividing a complex problem into smaller chunks makes our program easy to understand and reusable. There are two types of function: Standard Library Functions:  Predefined in C++ User-defined Function:  Created by users In this tutorial, we will focus mostly on user-defined functions. C++ User-defined Function C++ allows the programmer to define their own function. A user-defined function groups code to perform a specific task and that group of code is given a name (identifier). When the function is invoked from any part of the program, it all executes the codes defined in the body of the function. C++ Function Declaration The syntax to declare a function is: returnType functionName (parameter1, parameter2,...) { // func...

C++ Type Conversion

In C++, type conversion, also known as type casting, allows you to change the data type of a variable. This can be useful for various purposes, but it's important to understand the potential risks and use it cautiously. Here's a breakdown of C++ type conversion: Types of Type Conversion: Implicit Conversion: Done automatically by the compiler when necessary. Common cases: Promoting smaller integer types to larger ones (e.g.,  int  to  float ). Converting characters to integer equivalents (e.g.,  'A'  to  65 ). Assigning expressions with mixed types to a variable of higher precedence (e.g.,  int result = age + 3.14; ). Explicit Conversion: Done manually by the programmer using different methods: C-style casting:   (data_type) expression;  (e.g.,  int age = (int) 3.14; ). Functional notation:   static_cast<data_type>(expression);  (e.g.,  int age = static_cast<int>(3.14); ). Type conversion operators: dynamic_cas...