c ++创建和初始化数组的最佳方法

时间:2015-08-17 14:04:47

标签: c++ arrays memory

创建和初始化数组的更好(更有效)的方法是什么?

1. int array[3] {1,2,3};

2. int *array=new int[3]{1,2,3};

3 个答案:

答案 0 :(得分:3)

不要认为"更好"永远意味着更高效!在函数体中,这两者做了很多不同的事情:

int array[3] {1,2,3};

第一个分配本地存储(在堆栈上),该函数将在函数终止时释放。 (所以你不应该试图在那个生命周期之外使用它。)

int *array = new int[3] {1,2,3};

第二个分配新堆内存,当函数终止时不会释放。 (所以当你不再需要它时,你应该记得delete[]

答案 1 :(得分:1)

最好的方法是:

 int array[3] = {1,2,3}; // assignment operator added

在您的示例中,只有第一个是数组:

 int array[3];

第二个是指定了运算符new返回的地址的指针。要查看差异,请尝试sizeof(array)

int array[3];
cout << sizeof(array) << endl;

我的编译器显示12(即3 * sizeof(int),数组大小取决于元素数量),但

int *array=new int[3];
cout << sizeof(array) << end

我的编译器显示4(即sizeof(int *),指针大小仅取决于平台)

答案 2 :(得分:0)

让我们从第二个开始。     <?php // get the records from the database if ($result = $con->query(" SELECT inventory.InventoryID, descriptorid.dename, typeid.tyname, inventory.Serial, inventory.ServiceTag, inventory.CityTag, conditioncid.conname, statusid.statusname, locationid.locname, stationid.stationname, users.Fname, users.Lname, inventory.PurchaseDate, inventory.POnumber FROM inventory LEFT JOIN descriptorid ON inventory.Descriptor = descriptorid.dename LEFT JOIN typeid ON inventory.Type = typeid.tyname LEFT JOIN conditioncid ON inventory.ConditionC = conditioncid.conname LEFT JOIN statusid ON inventory.Status = statusid.statusname LEFT JOIN locationid ON inventory.Location = locationid.locname LEFT JOIN stationid ON inventory.Station = stationid.stationname LEFT JOIN users ON inventory.cuserFname = users.Fname AND inventory.cuserLname = users.Lname ")) { // display records if there are records to display if ($result->num_rows > 0) { // display records in a table echo "<table border id='myTable' class='tablesorter' >"; // set table headers echo "<thead><th>ID</th><th>Descriptor</th><th>Type</th><th>Serial</th><th>ServiceTag</th><th>CityTag</th><th>Condition</th><th>Status</th><th>Location</th><th>Station</th><th>CurrentUser</th><th>Lastname</th><th>PurchaseDate</th><th>POnumber</th><th></th><th></th></thead>"; echo "<tbody"; while ($row = $result->fetch_object()) { // dump whats returned // print_r($row); echo "<tr>"; echo "<td>" . $row->InventoryID . "</td>"; echo "<td>" . $row->Descriptor . "</td>"; echo "<td>" . $row->Type . "</td>"; echo "<td>" . $row->Serial . "</td>"; echo "<td>" . $row->ServiceTag . "</td>"; echo "<td>" . $row->CityTag . "</td>"; echo "<td>" . $row->ConditionC . "</td>"; echo "<td>" . $row->Status . "</td>"; echo "<td>" . $row->Location . "</td>"; echo "<td>" . $row->Station . "</td>"; echo "<td>" . $row->cUserFname . "</td>"; echo "<td>" . $row->cUserLname . "</td>"; echo "<td>" . $row->PurchaseDate . "</td>"; echo "<td>" . $row->POnumber . "</td>"; echo "<td><a href='invrecords.php?InventoryID=" . $row->InventoryID . "'><img src='img/default/button_mini_ticket_edit.gif'></a></td>"; echo '<td><a href="javascript:void(0);" onclick="confirmation(' . $row->InventoryID . ');"><img src="img/default/button_mini_delete.gif"></a>'; echo "</tr>"; } echo "</tbody>"; echo "</table>"; ;

它创建了一个动态数组。“动态”意味着内存将在运行时分配,而不是在编译时分配。因此,上面的初始化将创建一个大小为3的数组,并将使用给定的值进行初始化。记住动态分配的内存没有预定义的范围,因此需要使用'delete'运算符释放内存。使用指针时也要小心,因为如果使用不当,它们可能会在程序中造成严重破坏!

现在是第一个。 int *array = new int[3] {1,2,3}

它创建一个大小为3的数组,并使用给定的值对其进行初始化。在这种情况下,内存是静态分配的(在编译期间)。只要程序继续,变量就会停留在内存中然后消失! 因此,您可以根据需要决定阵列初始化的类型。