Вы должны быть очень осторожны при использовании сырых указателей с динамической памятью, но вот простой пример.
int main() {
// Normal Pointer To Type
int* pX = nullptr;
pX = new int;
*pX = 3;
std::cout << *pX << std::endl;
// Clean Up Memory
delete pX;
pX = nullptr;
// Pointer To Array
int* pXA = nullptr;
pXA = new int[10]; // 40 Bytes on 32bit - Not Initialized All Values Have Garbage
pXA = new int[10](0); // 40 Bytes on 32bit - All Values Initialized To 0.
// Clean Up Memory To An Array Of Pointers.
delete [] pXA;
pXA = nullptr;
return 0;
} // main
Во избежание утечек памяти; висячие указатели, удаление памяти до начала и т. д. Попробуйте использовать интеллектуальные указатели. Они бывают двух разновидностей: общие и уникальные.
SomeClass.h
#ifndef SOME_CLASS_H
#define SOME_CLASS_H
class SomeClass {
private:
int m_x;
public:
SomeClass();
explicit SomeClass(x = 0);
void setX(int x);
int getX() const;
private:
SomeClass(const SomeClass& c); // Not Implemented - Copy Constructor
SomeClass& operator=(const SomeClass& c); Not Implemented - Overloaded Operator=
}; // SomeClass
#endif // SOME_CLASS_H
SomeClass.cpp
#include "SomeClass.h"
// SomeClass() - Default Constructor
SomeClass::SomeClass() :
m_x(x) {
} // SomeClass
// SomeClass() - Constructor With Default Parameter
SomeClass::SomeClass(int x) :
m_x(x) {
} // SomeClass
// setX()
void SomeClass::setX(int x) {
m_x = x;
} // setX
// getX()
void SomeClass::getX() const {
return m_x;
} // getX
Старый способ использования динамической памяти
#include <iostream>
#include "SomeClass.h"
int main() {
// Single Dynamic Pointer
SomeClass* pSomeClass = nullptr;
pSomeClass = new SomeClass(5);
std::cout << pSomeClass->getX() << std::endl;
delete pSomeClass;
pSomeClass = nullptr;
// Dynamic Array
SomeClass* pSomeClasses = nullptr;
pSomeClasses = new SomeClasses[5](); // Default Constructor Called
for (int i = 0; i < 5; i++) {
pSomeClasses[i]->setX(i * 10);
std::cout << pSomeSomeClasses[i]->getX() << std::endl;
}
delete[] pSomeClasses;
pSomeClasses = nullptr;
return 0;
} // main
Проблема здесь в том, чтобы знать, когда, где и зачем удалять память; зная, кто несет ответственность. Если вы удаляете память для ее управления, а пользователь вашего кода или библиотеки предполагает, что вы этого не сделали, и они удаляют его, возникает проблема, так как одна и та же память пытается удалить дважды. Если вы оставите его пользователю, чтобы удалить его, и они предположили, что сделали, и у вас нет проблем, и есть утечка памяти. Здесь полезно использовать интеллектуальные указатели.
Смарт Pointer Версия
#include <iostream>
#include <memory>
#include <vector>
#include "SomeClass.h"
int main() {
// SHARED POINTERS
// Shared Pointers Are Used When Different Resources Need To Use The Same Memory Block
// There Are Different Methods To Create And Initialize Shared Pointers
auto sp1 = std::make_shared<SomeClass>(10);
std::shared_ptr<SomeClass> sp2(new SomeClass(15));
std::shared_ptr<SomeClass> sp3;
sp3 = std::make_shared<SomeClass>(20);
std::cout << "SP1: " << sp1->getX() << std::endl;
std::cout << "SP2: " << sp2->getX() << std::endl;
std::cout << "SP3: " << sp3->getX() << std::endl;
// Now If you Reach The Return Of Main; These Smart Pointers Will Decrement
// Their Reference Count & When It Reaches 0; Its Destructor Should Be
// Called Freeing All Memory. This Is Safe, But Not Guaranteed. You Can
// Release & Reset The Memory Your Self.
sp1.reset();
sp1 = nullptr;
sp2.reset();
sp2 = nullptr;
sp3.reset();
sp3 = nullptr;
// Need An Array Of Objects In Dynamic Memory?
std::vector<std::shared_ptr<SomeClass>> vSomeClasses;
vSomeClasses.push_back(std::make_shared<SomeClass>(2));
vSomeClasses.push_back(std::make_shared<SomeClass>(4));
vSomeClasses.push_back(std::make_shared<SomeClass>(6));
std::vector<std::shared_ptr<SomeClass>> vSomeClasses2;
vSomeClasses2.push_back(std::shared_ptr<SomeClass>(new SomeClass(3)));
vSomeClasses2.push_back(std::shared_ptr<SomeClass>(new SomeClass(5)));
vSomeClasses2.push_back(std::shared_ptr<SomeClass>(new SomeClass(7)));
// UNIQUE POINTERS
// Unique Pointers Are Used When Only One Resource Has Sole Ownership.
// The Syntax Is The Same For Unique Pointers As For Shared Just Replace
// std::shared_ptr<SomeClass> with std::unique_ptr<SomeClass> &
// replace std::make_shared<SomeClass> with std::make_unique<SomeClass>
// As For Release Memory It Is Basically The Same
// The One Difference With Unique Is That It Has A Release Method Where Shared Does Not.
auto mp1 = std::make_unique<SomeClass>(3);
mp1.release();
mp1.reset();
mp1 = nullptr;
// Now You Can Also Do This:
// Create A Unique Pointer To An Array Of 5 Integers
auto p = make_unique<int[]>(5);
// Initialize The Array
for (int i = 0; i < 5; i++) {
p[i] = i;
}
return 0;
} // main
Здесь даны ссылки Ссылки на оба общей & Unique легавых
https://msdn.microsoft.com/en-us/library/hh279669.aspx
https://msdn.microsoft.com/en-us/library/hh279676.aspx
Я настоятельно рекомендую, глядя на индекс (или таблица содержимое) вашего C++-ссылки для «new» или «oper ator new "или" dynamic memory ". Любая хорошая ссылка должна указывать, как распределять и освобождать память. –
Используйте 'std :: vector'. –
Вот множество статей [StackOverflow о распределении памяти для C++] (https://www.google.com/search?q=stackoverflow+c%2B%2B+allocate+memory+new&ie=utf-8&oe=utf-8). –